我对编码事物非常陌生。我一直在尝试替换特定元素。
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}}
我完全不知道,需要你的帮助。 感谢
答案 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
或者等于1
和2
。
$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