Bash脚本处理CSV写入新文件时前几列字段缺失异常问题求助
异常原因
- 最可能的原因是输入的CSV为Windows格式,行尾携带
\r回车符:读取到的最后一个字段末尾会附带该回车符,输出时回车符会让光标回到行首,后续输出的数字、逗号等内容会直接覆盖开头的strain、type、seqtec字段内容,视觉上表现为这三个字段为空。 - 次可能的原因是read命令的变量列表和输入CSV的列数不匹配:你当前代码中read行写的是
read -r strain type state seqtec,共声明了4个变量,如果输入CSV每行只有3列,那么第三列内容会被赋值给未使用的state变量,输出时用到的seqtec会为空;如果列数不匹配更严重,会出现字段错位的问题。 - 少数情况下是循环内的samtools命令意外消耗了标准输入,导致后续read命令读取内容为空。
可行解决方案
- 优先处理换行符问题:
可以直接用命令转换输入文件格式:dos2unix $INPUT
也可以直接修改read语句,将回车符设为分隔符,同时匹配输入列数调整变量列表:如果不需要第三列的state,用_作为占位符丢弃,示例如下:echo "Strain,Type,SeqTec,Reads,SamclipReads,PercTrimmedReads" > $OUTPUT # 将\r加入IFS,同时变量数对应输入列数,不需要的列用_占位 while IFS=$',\r' read -r strain type _ seqtec do # 给samtools命令加/dev/null重定向,避免消耗标准输入 OUTRM=$(samtools view -c "$RMDIR$strain$RMEND" < /dev/null) OUTBAM=$(samtools view -c "$BAMDIR$strain$BAMEND" < /dev/null) PERC=$(awk "BEGIN {print ($OUTBAM - $OUTRM)*100 / $OUTBAM}") echo "${strain},${type},${seqtec},${OUTBAM},${OUTRM},${PERC}" >> $OUTPUT done < "$INPUT" - 调整前可先加调试语句验证变量读取是否正常:在循环第一行加入
echo "strain: ${strain} | type: ${type} | seqtec: ${seqtec}",即可直接确认变量读取结果是否符合预期。
内容的提问来源于stack exchange,提问作者Iseez
相关产品推荐
相关产品推荐

