替换特定元素

时间:2016-06-06 19:42:52

标签: bash awk

我对编码事物非常陌生。我一直在尝试替换特定元素。

 for ((i=n1;i<n1+5;i++))
 do
 n2=`grep -n "$i" test.txt | cut -d ':' -f1`
 let n3=$n2{print $3}
 awk 'n3==7 (n2-2){print $3=0}' 
 done test < test1

首先要查找第3列中包含7的行。 然后,如果该行有7,则要将该行上方的第二列替换为0。

{{1}}

我完全不知道,需要你的帮助。 感谢

1 个答案:

答案 0 :(得分:0)

我假设字段数总是5,否则调整脚本。

尝试一下:

awk '$3=="7" && NR>2{b[3,1+NR%2]="0"}
NR>2{i=1+NR%2;print b[1,i],b[2,i],b[3,i],b[4,i],b[5,i]}
{i=1+NR%2;for(j=1;j<=NF;j++) b[j,i]=$j}
END {for (i=1;i<=2;i++) print b[1,i],b[2,i],b[3,i],b[4,i],b[5,i]}' text.txt

有一个优秀的教程从Awk - A Tutorial and Introduction - by Bruce Barnett

开始

以上awk脚本使用二维数组(b[f,l]缓冲区)来存储前两行的字段。

脚本的每一行都遵循pattern {commands}

NR是记录(行)编号。 1+NR%2或者等于12

$3=="7" && NR>2{b[3,1+NR%2]="0"}:当前第3个字段等于7时,记录(行)NR-2的第3个字段重置为零。

NR>2{i=1+NR%2;print b[1,i],b[2,i],b[3,i],b[4,i],b[5,i]}:从记录数字3开始打印存储在缓冲区中的记录(行)NR-2的字段。

{i=1+NR%2;for(j=1;j<=NF;j++) b[j,i]=$j}:当前记录(行)的字段保存到缓冲区中。

END {for (i=1;i<=2;i++) print b[1,i],b[2,i],b[3,i],b[4,i],b[5,i]}:当awk到达文件末尾时,缓冲区中仍有2行;它们被打印出来。

测试:

$ cat text.txt
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 7 4 5
1 2 7 4 5
$ awk '$3=="7" && NR>2{b[3,1+NR%2]="0"}
NR>2{i=1+NR%2;print b[1,i],b[2,i],b[3,i],b[4,i],b[5,i]}
{i=1+NR%2;for(j=1;j<=NF;j++) b[j,i]=$j}
END {for (i=1;i<=2;i++) print b[1,i],b[2,i],b[3,i],b[4,i],b[5,i]}' text.txt
1 2 3 4 5
1 2 0 4 5
1 2 0 4 5
1 2 7 4 5
1 2 7 4 5