awk 帮助从特定列打印到最后

use*_*373 1 awk

我有一个这样的文件

gene    -   chr7    55675   55676   100 100
gene    -   chr7    55678   55679   100 100
gene    -   chr7    55683   55686   NP  100
Run Code Online (Sandbox Code Playgroud)

该文件是制表符分隔的。

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

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

我更喜欢它的 awk 解决方案。

谢谢

Joh*_*024 8

交换字段 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
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • -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
Run Code Online (Sandbox Code Playgroud)

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

另类风格

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

awk -F'\t' -v OFS='\t' '{a=$4; $4=$5; $5=a;} 1' file
Run Code Online (Sandbox Code Playgroud)