如何用awk重复打印制表符分隔文件的最后一列?
解决制表符分隔文件重复打印最后一列的问题
首先,咱们先捋清楚你遇到的问题根源:你说用awk '{print $0,$5}'只输出最后一列,这大概率是因为文件里的换行符是Windows格式的CRLF(\r\n),而非Unix系统默认的LF(\n)。当awk读取到每行末尾的\r时,打印$0后光标会直接回到行首,紧接着打印的$5就把前面的内容覆盖了,看起来就只剩最后一列了。
当然,也有可能是awk默认字段分隔符的模糊性导致的混淆(虽然cut能正常工作说明是制表符分隔,但明确指定分隔符会更稳妥)。下面给你几个靠谱的解决方案:
方案1:明确指定分隔符+处理换行符
直接用awk指定输入/输出字段分隔符为制表符,同时去掉行尾的回车符:
awk -v FS="\t" -v OFS="\t" '{sub(/\r$/,""); print $0, $5}' file1.txt
解释:
-v FS="\t":告诉awk输入内容是制表符分隔-v OFS="\t":输出也用制表符分隔,保持和原文件格式一致sub(/\r$/,""):移除行尾的Windows回车符(如果存在的话)print $0, $5:打印整行内容后,追加一遍最后一列
方案2:先转换文件换行符为Unix格式
如果确认是换行符的问题,可以先用工具转换文件格式,再用简单的awk命令:
dos2unix file1.txt awk '{print $0, $5}' file1.txt
转换完成后,你最初尝试的简单命令就能正常工作了。
方案3:一步实现你的需求(无需管道)
你之前用了两个awk管道,其实完全可以一步搞定,还能避免中间环节可能出现的问题:
awk -v FS="\t" -v OFS="\t" '{print $1,$2,$3,$4,$5,$5}' file1.txt
这个命令直接指定分隔符,然后按顺序打印前5列再加一遍第5列,完全匹配你的需求。
另外,你可以用cat -A file1.txt查看文件的隐藏字符,如果看到每行末尾是^M$,就说明确实是Windows换行符在搞鬼,用上面的方案1或2就能解决啦。
内容的提问来源于stack exchange,提问作者bapors
相关产品推荐
相关产品推荐

