[英]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.