繁体   English   中英

重击:用另一列替换列并使用AWK打印特定顺序

[英]Bash: replacing a column by another and using AWK to print specific order

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

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列打印到最后一列,而不必写下所有名称?

谢谢

我认为这应该做

$ 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只是写入始终为真的条件的一种方法

有关更多此类习语,请参见https://stackoverflow.com/tags/awk/info中提到的惯用awk

跟随awk也可以在这里帮助您。

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

输出如下。

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

说明:它的解释很简单,使用awk sub实用程序将$2 (第二个字段)中的所有内容替换$2 FNR ,这是awk的现成变量,代表任何Input_file的当前行号,然后提及1将打印当前行Input_file。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM