linux - 使用awk将列中的值替换为txt文件中的另一个值

标签 linux bash awk

我是 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/

相关文章:

python - 从 vim 发送代码到 stata

linux - 如何使用 unix 在 XML 文件中的特定标记之间添加或替换特定字段

c - 如何正确使用 recv() 系统调用

linux - 如何跟踪 EC2 实例或弹性 IP 上的公共(public)带宽使用情况?

string - 带有额外空格的多行字符串(保留缩进)

regex - 从文件名中有选择地提取数字

linux - 将大行拆分为较小的行,并在换行符的开头插入特殊字符

python - 在 csv 中查找重复项和重复项的唯一性

linux - Jenkins : "javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;"

php - 如何使用 php 重启 linux 系统 (Debian)