替换特定元素

  • 本文关键字:元素 替换 bash awk
  • 更新时间 :
  • 英文 :


我对编码很陌生。几天来,我一直在尝试替换特定元素。

 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 或者等于 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]}:缓冲区中存储的记录(行)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

相关内容

  • 没有找到相关文章