我有一个这样的文件
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 解决方案。
谢谢
交换字段 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)