使用awk选取指定列时如何保留换行符与空白字符且无多余输出符号
问题原因
你的原命令存在两个核心问题:
- awk默认按任意连续空白分割字段,示例中
U A 35这行U和A之间的空白会被合并为单个分隔符,导致字段识别错误:这行的$2被识别为A、$3被识别为35,无法命中$3=="A"的筛选条件,本该输出的空格就丢失了,最终所有有效字符直接拼接为HEETE。 - 你手动设置了ORS=""(输出记录分隔符为空),最终输出没有结尾换行符,zsh等终端会在无换行的输出末尾自动添加
%作为无结束换行的标记,就是你看到的奇怪符号。
正确解决方案
因为你的文件是固定字符位置对齐的格式,直接按单个字符分割字段取值即可,单条awk命令就能完成:
awk 'BEGIN{FS=""}{if($5=="A") res=res$3}END{print res}' your_file
命令解释
BEGIN{FS=""}:设置字段分隔符为空,将每个字符单独识别为一个字段- 每行的第5个字段对应原文件第三列的值,判断为A时,将第3个字段(对应原文件第二列的内容,包括空值/空格)追加到结果变量res中
- END块中统一打印结果,自带结尾换行,不会出现
%标记
运行后输出完全符合预期:
HEE TE
补充:如果你的文件是制表符分隔的非固定宽度格式,可改用以下命令:
awk 'BEGIN{FS="\t"}{if($3=="A") res=res$2}END{print res}' your_file
内容的提问来源于stack exchange,提问作者Caterina
相关产品推荐
相关产品推荐

