使用awk打印制表文件时列混乱问题求助
问题描述
执行awk命令处理制表分隔的BED文件时出现列混乱、字段拼接异常:
使用命令:
awk '{print $1"\t"$7"\t"$8"\t"$4}' RACP_primers_v4.0.bed
输入文件部分内容(视觉格式正常):
chr2 197401726 197401984 SF3B1_742-781_F_P5 0 + 197401750 197401960 chr2 197401726 197401984 SF3B1_742-781_R_P5 0 - 197401750 197401960 chr2 197401930 197402137 SF3B1_700-740_F_P5 0 + 197401955 197402117 chr2 197401930 197402137 SF3B1_700-740_R_P5 0 - 197401955 197402117 chr2 197402603 197402673 SF3B1_662-666_F_P5 0 + 197402625 197402655 chr2 197402603 197402673 SF3B1_662-666_R_P5 0 - 197402625 197402655 chr2 197402737 197402873 SF3B1_622-626_F_P5 0 + 197402757 197402847 chr2 197402737 197402873 SF3B1_622-626_R_P5 0 - 197402757 197402847 chr2 208248338 208248464 IDH1_R132_F_P5 0 + 208248363 208248440 chr2 208248338 208248464 IDH1_R132_R_P5 0 - 208248363 208248440
但输出出现字段拼接、列混乱,示例如下:
chr2 SF3B1_742-781_F_P57401960 chr2 SF3B1_742-781_R_P57401960 chr2 SF3B1_700-740_F_P57402117 chr2 SF3B1_700-740_R_P57402117 chr17 TP53_11_F_P5717 chr17 TP53_11_R_P5717 chr17 TP53_10_F_P5734 chr17 TP53_10_R_P5734
异常原因
核心问题是文件行尾存在Windows风格的换行符\r(回车符),而非Unix/Linux系统默认的\n(换行符)。
awk处理这类文件时,\r会被包含在最后一个字段(此处为$8)的末尾。当执行print $1"\t"$7"\t"$8"\t"$4时,$8末尾的\r会让光标跳回当前行开头,后续输出的$4会覆盖前面已打印的内容,最终呈现出字段拼接的视觉效果。
比如输出中的SF3B1_742-781_F_P57401960,实际是$4(SF3B1_742-781_F_P5)覆盖了$7和$8的部分内容,并非字段本身拼接。
解决方法
1. 转换文件换行符
使用dos2unix将Windows格式转为Unix格式:
dos2unix RACP_primers_v4.0.bed
若无dos2unix,可通过sed替代:
sed -i 's/\r$//' RACP_primers_v4.0.bed
2. 直接在awk中处理
不修改源文件,在awk命令中移除\r:
awk '{gsub(/\r/,"",$0); print $1"\t"$7"\t"$8"\t"$4}' RACP_primers_v4.0.bed
或指定分隔符时同时匹配\r:
awk -F'\t|\r' '{print $1"\t"$7"\t"$8"\t"$4}' RACP_primers_v4.0.bed
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

