我是 Linux 和 awk 脚本编写的新手。我有 tab delim txt 文件,如下所示:
AAA 134 145 Sat 150 167
AAA 156 167 Sat 150 167
AAA 175 187 Sat 150 167
我只想将最后一行第二列(175)中的值替换为最后一行第五列(150+1)中的值,以便我的最终输出应如下所示
AAA 134 145 Sat 150 167
AAA 156 167 Sat 150 167
AAA 151 187 Sat 150 167
我尝试了 awk '$2=$5+1' file.txt
但它更改了第二列中我不想要的所有值。我只想用 150(+1) 替换 175。请指导我
最佳答案
困难在于,与 sed 不同,awk 不会告诉我们何时处理最后一行。这是一种解决方法:
$ awk 'NR>1{print last} {last=$0} END{$0=last;$2=$5+1;print}' OFS='\t' file.txt
AAA 134 145 Sat 150 167
AAA 156 167 Sat 150 167
AAA 151 187 Sat 150 167
这是通过将前一行保留在变量last
中来实现的。更详细:
NR>1{最后打印}
对于除第一行之外的每一行,打印
last
。last=$0
更新
last
的值。END{$0=最后一个; $2=$5+1;打印}
当我们到达文件末尾时,更新字段 2 并打印。
OFS='\t'
将输出上的字段分隔符设置为选项卡。
替代方法
此方法读取文件两次,第一次计算行数,第二次更改最后一行。因此,这效率较低,但可能更容易理解:
$ awk -v n="$(wc -l <file.txt)" 'NR==n{$2=$5+1} 1' OFS='\t' file.txt
AAA 134 145 Sat 150 167
AAA 156 167 Sat 150 167
AAA 151 187 Sat 150 167
更改第一行
$ awk 'NR==1{$2=$5+1} 1' OFS='\t' file.txt
AAA 151 145 Sat 150 167
AAA 156 167 Sat 150 167
AAA 175 187 Sat 150 167
更改第一行和最后一行
$ awk 'NR==1{$2=$5+1} NR>1{print last} {last=$0} END{$0=last;if(NR>1)$2=$5+1;print}' OFS='\t' file.txt
AAA 151 145 Sat 150 167
AAA 156 167 Sat 150 167
AAA 151 187 Sat 150 167
关于linux - 使用awk将列中的值替换为txt文件中的另一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677961/