【发布时间】:2022-01-26 08:03:05
【问题描述】:
我想使用 awk 来匹配一个大文件中出现的所有模式。对于每个匹配,我想打印行号和模式沿行的起始位置(xy 坐标排序)。每行中出现多次该模式。 我发现this 有点相关的问题。
到目前为止,我只在每行的第一个(最左边)出现时才做到这一点。举个例子:
echo xyzABCdefghiABCdefghiABCdef | awk 'match($0, /ABC/) {print NR, RSTART } '
结果输出是:
1 4
但我希望是这样的:
1 4
1 13
1 22
我尝试使用拆分而不是匹配。我设法识别出所有事件,但 RSTART 丢失并打印为“0”。
echo xyzABCdefghiABCdefghiABCdef | awk ' { split($0,t, /ABC/,m) ; for (i=1; i in m; i++) print (NR, RSTART) } '
输出:
1 0
1 0
1 0
任何建议将不胜感激。我不限于使用 awk,但 awk 解决方案将不胜感激。 此外,在我的情况下,要匹配的模式将是正则表达式 (/A.C/)。 谢谢
【问题讨论】:
-
如何处理重叠?例如,假设输入是
01010,而您正在寻找010... 1 或 2 个匹配项? -
在我目前的情况下,我确信文件中没有重叠。假设我认为最好有办法将重叠处理为两个单独的匹配。
-
请阅读how-do-i-find-the-text-that-matches-a-pattern,然后在您的问题中出现的任何地方用字符串或正则表达式替换“模式”一词。您还应该在搜索“模式”中使用正则表达式元字符,并将这些元字符包含在您的示例输入/输出中,这样我们就有了可以真正测试的东西。
-
还在您的示例中包含重叠字符串,例如在字符串
ABCABCABCABC中搜索ABCABC以显示输出是否应为1 1\n1 7或1 1\n1 4\n1 7或其他内容。正如所写的那样,您可以获得从示例输入中产生预期输出的答案,但实际上并没有做任何您需要的事情。