繁体   English   中英

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

[英]Replacing value in column with another value in txt file using awk

我是linux和awk脚本的新手。 我有标签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{print last}

    对于除第一行外的每一行, last打印。

  • last=$0

    更新last的值。

  • END{$0=last; $2=$5+1; print}

    当我们到达文件末尾时,更新字段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

@ John1024的答案非常有用。

awk具有内置的getline函数来处理文件。

成功返回1 ,文件结束返回0 ,错误返回-1

awk '{ 
        line=$0; 
        if (getline == 0 ) {
           $2=$5+1; 
           print $0; 
        } else { 
           print  line RS $0;
        }
     }' OFS='\t' file.txt

暂无
暂无

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

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