在动态线条范围内重复替换图案 [关闭]

repeated replace of pattern in dynamic range of lines [closed]

提问人:sameucho 提问时间:11/17/2023 最后编辑:sameucho 更新时间:11/17/2023 访问量:69

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

6天前关闭。

我有非常大的文件,其中包含许多行上的模式“AAAx”,我需要用数字替换。将用作替换字符串的编号取决于文件中出现 AAAx 模式的行号。不同的线范围使用不同的数字。

我使用以下 awk 命令修改一定范围内的行中的模式,效果正常。替换的行范围由给定的“n”计算得出:

awk '{C=123;n=1;Z=4633+n*12616;K=4632+(n+1)*12616}; NR>=Z && NR<=K{for(x=1;x<=NF;x++)if($x~/AAAx/){sub(/AAAx/,C)}}1' file1.cfg > file2.cfg

或者,清晰地:

awk -o- '{C=123;n=1;Z=4633+n*12616;K=4632+(n+1)*12616}; NR>=Z && NR<=K{for(x=1;x<=NF;x++)if($x~/AAAx/){sub(/AAAx/,C)}}1'
{
        C = 123
        n = 1
        Z = 4633 + n * 12616
        K = 4632 + (n + 1) * 12616
}

NR >= Z && NR <= K {
        for (x = 1; x <= NF; x++) {
                if ($x ~ /AAAx/) {
                        sub(/AAAx/, C, $0)
                }
        }
}

1 {
        print
}

但我需要对“C”和“n”的不同值重复它,因此我将其修改如下:

awk 'C=123; {                                                                                                         
  for(n=2;n<300;n++){                                                                                                                              
    {C+=2; Z=4633+n*12616;K=4632+(n+1)*12616};NR>=Z && NR<=K{for(x=1;x<=NF;x++)if($x~/AAAx/){sub(/AAAx/,C)}}1                                            |
  }                                                                                                                                                
}' file1.cfg > file2.cfg     

或者,清晰地:

C = 123 {
        print
}

{
        for (n = 2; n < 300; n++) {
                C += 2
                Z = 4633 + n * 12616
                K = 4632 + (n + 1) * 12616
                NR >= Z && NR <= K {
                        for (x = 1; x <= NF; x++) {
                                if ($x ~ /AAAx/) {
                                        sub(/AAAx/, C, $0)
                                }
                        }
                }
                1
        }
}

但是由于语法错误,这段代码不起作用:

  for(n=2;n<300;n++){                                                                                                                              
    {Z=4633+n*12616;K=4632+(n+1)*12616};NR>=Z && NR<=K{for(x=1;x<=NF;x++)if($x~/AAAx/){sub(/AAAx/,n)}}1
  }
}' file1.cfg > file2.cfg
awk: cmd. line:3:     {Z=4633+n*12616;K=4632+(n+1)*12616};NR>=Z && NR<=K{for(x=1;x<=NF;x++)if($x~/AAAx/){sub(/AAAx/,n)}}1
awk: cmd. line:3:                                                       ^ syntax error

或者,清晰地:

awk '
C = 123 {
        print
}

{
        for (n = 2; n < 300; n++) {
                C += 2
                Z = 4633 + n * 12616
                K = 4632 + (n + 1) * 12616
                NR >= Z && NR <= K {
                        for (x = 1; x <= NF; x++) {
                                if ($x ~ /AAAx/) {
                                        sub(/AAAx/, C, $0)
                                }
                        }
                }
                1
        }
}
' file1.cfg > file2.cfg
awk: cmd. line:11:                 NR >= Z && NR <= K {
awk: cmd. line:11:                                    ^ syntax error

...我不明白为什么。甚至可以在 awk 中使用这种嵌套循环吗?

感谢您的帮助

哎呀呀

评论

2赞 Mark Setchell 11/17/2023
请单击编辑并添加您的最小可重现示例。我们不知道您的数据是什么样子的,也不知道您想要实现什么。
1赞 markp-fuso 11/17/2023
此外,如果您收到语法错误,那么将语法错误包含在问题中可能会有所帮助;话虽如此......尝试重新格式化您的代码以使其更易于阅读......要检查的一个特定项目是(不)正确/不匹配的大括号;第三行末端的管道 () 出路的目的是什么?|
0赞 Ed Morton 11/17/2023
我保证,如果您没有将如此多的代码塞进一行中,符号之间甚至没有空格,那么查找和修复语法错误会容易得多。我使用 GNU awk 格式化了您的脚本,以便您清晰易读,以便您可以清楚地看到语法错误。-o-
0赞 markp-fuso 11/17/2023
在工作脚本中...正在为从输入文件中读取的每一行执行赋值;由于这些变量永远不会改变,因此您应该考虑只执行一次赋值,例如,在一个块中;最简单的“修复”是在您执行 assigments 的部分的左大括号之前添加;至于......C / n / Z / KBEGIN { ... }BEGINC / n / Z / K
0赞 markp-fuso 11/17/2023
...第二个(非工作)脚本,看起来(对我来说)目的是在可变数量的范围内进行搜索(对于不同的值);您需要重新扫描每个新集合的输入文件,或者考虑预先生成范围(例如,在块中;将范围存储在数组中),然后修改代码以检查为每个范围的成员awkNR >= Z && NR <= KZ / KZ / KBEGIN { ... }NR

答: 暂无答案