我对编码很陌生。几天来,我一直在尝试替换特定元素。
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
首先要查找第 3 列中有 7 的行。然后,如果该行有 7,则要将行上方两列中的第 3 列替换为 0。
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
我完全不知道,需要你的帮助。谢谢
我假设字段数始终为 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 - 教程和介绍开始 - 布鲁斯·巴内特
上面的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]}
:缓冲区中存储的记录(行)NR-2的字段从记录编号3开始打印。
{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