拆分(使用指定的分隔符)选定的列

时间:2016-09-28 21:33:22

标签: shell unix awk

我有一个制表符分隔文件,想要修改它。最后一列是以管道分隔的,我想将该列拆分(从管道到选项卡),同时避免使用管道拆分其他列。

这可以将管道转换为制表符,但我无法让它只在选定的列上进行拆分13.有没有办法让这个工作只在最后一列而不必指定它?

awk -F'|' '$13=$13' OFS="\t" inputfile.tsv > split.tsv

1 个答案:

答案 0 :(得分:3)

让我们考虑这个制表符分隔的测试文件:

$ cat file
a|b     c|d     e|f     g
one     two     three   four

分解|上的第三列:

$ awk -F'\t' '{gsub(/[|]/, "\t", $3)} 1' OFS='\t' file
a|b     c|d     e       f       g
one     two     three   four

对于您的文件,您需要将$3替换为$13

awk -F'\t' '{gsub(/[|]/, "\t", $13)} 1' OFS='\t' file

或者,要替换最后一列,无论它是什么列,请使用:

awk -F'\t' '{gsub(/[|]/, "\t", $NF)} 1' OFS='\t' file

如何运作

  • -F'\t'在输入标签上设置字段分隔符。

  • gsub(/[|]/, "\t", $13)使用字段|中的标签替换$13

  • 1是awk用于打印线的神秘短手。

  • OFS='\t'告诉awk使用标签作为输出的字段分隔符。

替代形式

如果\t仅编码一次而不是三次,则可能更清晰,更容易维护。在这种情况下(帽子提示:Ed Morton):

awk 'BEGIN{FS=OFS="\t"} {gsub(/[|]/, OFS, $NF)} 1' file