我对编码非常陌生,几天来我一直在尝试替换特定的元素。
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首先要查找在第三列中有7的行。然后如果行中有7行,则要将行上两行中的第三列替换为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我完全不知道,需要你的帮助。谢谢
发布于 2016-06-07 04:15:00
我假设字段的数量始终为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"}:当当前第三个字段等于7时,记录(行) NR-2的第三个字段被重置为零。
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 5https://stackoverflow.com/questions/37665615
复制相似问题