awk 帮助从特定列打印到末尾

awk 帮助从特定列打印到末尾

我有一个这样的文件

gene    -   chr7    55675   55676   100 100
gene    -   chr7    55678   55679   100 100
gene    -   chr7    55683   55686   NP  100

该文件以制表符分隔。

我想更改文件,使第 5 列应位于第 4 列,第 4 列应位于第 5 列,然后按原样打印所有列。我只向您展示了第 5 列之后的 2 列,但还可以有更多列。

我尝试过cut -f 1,2,3,5,4,6-,但不起作用。

我更喜欢 awk 解决方案。

谢谢

答案1

交换字段 4 和 5:

$ awk -F'\t' '{a=$4; $4=$5; $5=a;} 1' OFS='\t' file
gene    -       chr7    55676   55675   100     100
gene    -       chr7    55679   55678   100     100
gene    -       chr7    55686   55683   NP      100

怎么运行的:

  • -F'\t'

    这将设置选项卡输入上的字段分隔符。

  • a=$4; $4=$5; $5=a

    这交换了第四和第五字段。

  • 1

    这是 awk 对 print-the-line 的神秘简写。

  • OFS='\t'

    这告诉 awk 使用制表符作为输出的字段分隔符。

保持标题不变

要交换除第一行之外的所有行上的字段:

awk -F'\t' -v OFS='\t' 'NR>1{a=$4; $4=$5; $5=a;} 1' file

NR是行号。放置NR>1在交换命令之前的是一个条件。仅当条件为真时才会执行交换命令。

另类风格

一些造型师建议将 OFS 的分配放在代码之前:

awk -F'\t' -v OFS='\t' '{a=$4; $4=$5; $5=a;} 1' file

相关内容