awk交换字段时第三字段仅打印首个单词的原因及解决方法
问题原因
- awk 默认输入字段分隔符
FS是任意连续空白(空格、制表符都算分隔标记),你只设置了输出分隔符OFS为制表符,没指定输入分隔规则,导致第三列里的空格被当成了字段分割点,原本一整列的mitochondrial genome maintenance被拆成了三个独立字段:$3只存了第一个词mitochondrial,后面的genome和maintenance分别存在$4、$5里,你只打印$3当然拿不到完整内容。
解决方法
处理制表符分隔文件时,必须同时指定输入、输出分隔符为制表符,让awk严格按制表符切分字段,字段内部的空格会被当做普通文本保留,不会被拆分:
awk 'BEGIN{FS=OFS="\t"}{print $2,$1,$3}' file.txt
执行后输出完全符合预期:
Akt3 GO:0000002 mitochondrial genome maintenance Mef2a GO:0000002 mitochondrial genome maintenance Mgme1 GO:0000002 mitochondrial genome maintenance Mpv17 GO:0000002 mitochondrial genome maintenance Mrpl15 GO:0000002 mitochondrial genome maintenance
如果你的文件后续列数不固定,只是要交换前两列、保留后面所有原始内容,可以用更通用的写法,不需要关心总共有多少字段:
awk 'BEGIN{FS=OFS="\t"}{tmp=$1; $1=$2; $2=tmp; print $0}' file.txt
内容的提问来源于stack exchange,提问作者ForEverNewbie
相关产品推荐
相关产品推荐

