Bash:用另一个替换列并使用AWK打印特定订单

时间:2017-11-28 14:47:03

标签: bash awk

我有一个看起来像这样的虚拟文件:

a ID_1 S1 S2
b SNP1 1 0
c SNP2 2 1
d SNP3 1 0

我想用相应的行号替换第2列的内容。我的文件看起来如此:

a 1 S1 S2
b 2 1 0
c 3 2 1
d 4 1 0

我可以使用以下命令执行此操作:

cut -f 1,3-4 -d " " file.txt | awk '{print $1 " " FNR " " $2,$3}'

我的问题是,有更好的方法吗?特别是,我正在处理的真实文件有2303列。显然我不想写:

cut -f 1,3-2303 -d " " file.txt | awk '{print $1 " " FNR " " $2,$3,$4,$5 ETC}'

有没有办法告诉awk从第2列打印到最后一列而不必写所有名称?

由于

2 个答案:

答案 0 :(得分:3)

我认为应该这样做

$ awk '{$2=FNR} 1' file.txt 
a 1 S1 S2
b 2 1 0
c 3 2 1
d 4 1 0

更改第二列并打印更改的记录。默认OFS是单个空格,这是你需要的


上面的命令是惯用的写作方式

awk '{$2=FNR} {print $0}' file.txt 

您可以将简单的awk计划视为awk 'cond1{action1} cond2{action2} ...'

仅当cond1的计算结果为true时,才会执行action1,依此类推。如果省略action部分,则awk默认打印输入记录。 1只是编写始终真实条件的一种方式

有关更多此类习语,请参阅Idiomatic awk中提及的https://stackoverflow.com/tags/awk/info

答案 1 :(得分:1)

关注awk也可能会帮助您。

awk '{sub(/.*/,FNR,$2)} 1'  Input_file

输出如下。

a 1 S1 S2
b 2 1 0
c 3 2 1
d 4 1 0

说明: 使用sub awk实用程序替换$2中的所有内容(第二个字段),说明很简单)FNRawk的开箱即用变量,表示任何Input_file的当前行号,然后提及1将打印当前的Input_file行。