【问题标题】:Shell script to print lines which match a pattern occurring on consecutive lines用于打印与连续行上出现的模式匹配的行的 Shell 脚本
【发布时间】:2023-03-15 20:52:01
【问题描述】:

我有大量的文本文件,并且使用 shell 脚本,想要搜索每个文件以识别字符串,例如“&abcdef”(表示每条记录的结尾),并且仅在连续出现时打印线。

输入文件内容file-a,其中一个文件的示例;还有其他类似但巨大的文件:

1239560059   TAB001   
8E12222439   TAB001   
84dswe6059   &abcdef
8229559179   &abcdef
8012156059   TAB001  
804E122224   TAB001  
8046317400 20120629 233000  20120629 
8046005912   TAB001   
8046559179 23222333   &abcdef
80463174E9   TAB001    
8024360099   TAB001  
8046316343   955912   &abcdef
8439559149   &abcdef
8044360059   TAB001    
8046360059   TAB001    
8034395879   &abcdef

需要输出:

  • file-a 的第 3 行和第 4 行在连续行中多次出现 &abcdef
  • file-a 的第 12 行和第 13 行在连续行中多次出现&abcdef

【问题讨论】:

  • 考虑将您已经尝试过但无法开始工作的内容添加到帖子中。至少对操作系统/可接受的脚本语言更具体一点。
  • 如果连续3行会怎样?三者的中线应该出现一次还是两次?
  • 如果模式在连续行中出现 2 行或更多行,则输出应识别这些行
  • 感谢您的输入,操作系统是 HP-UX,我是脚本方面的新手...尝试尽可能多地添加...我尝试使用 grep -n '&abcdef' 文件名,使用这些行号,我尝试循环,但无法成功。

标签: shell


【解决方案1】:

您可以使用 awk 来跟踪以前和当前出现的情况,如果它们彼此相邻,则打印两行。

awk 'BEGIN {prev=0} /&abcdef/ {if(prev==0) {prev=NR;line=$0} else {if((prev+1)==NR) {print line;print $0}; prev=NR; line=$0}}' file-a

BUG:有一个。如果出现多于一对,例如第 11、12、13 行出现,则代码将打印第 11、12、12、13 行。否则它将正常打印对。

如果您希望文件中出现超过 2 行的 &abcdef 连续行,请告诉我,我将修改此代码以适应它。

编辑:忘记在代码中包含文件名。

编辑:这是非常基本的,绝对可以改进。这是修改后的代码。

awk 'BEGIN {prev=0} /&abcdef/ {if(prev==0) {prev=NR;line=$0; print FILENAME} else {if((prev+1)==NR) {print NR-1 ":" line;print NR ":" $0}; prev=NR; line=$0}}' file-a

编辑:如果您希望文件名像行号一样预先添加,那么您的代码应该是。

awk 'BEGIN {prev=0} /&abcdef/ {if(prev==0) {prev=NR;line=$0} else {if((prev+1)==NR) {print FILENAME ":" NR-1 ":" line;print FILENAME ":" NR ":" $0}; prev=NR; line=$0}}' file-a

编辑:如果您只需要打印文件名和行号而不是行本身,那么您的代码应该是:

awk 'BEGIN {prev=0} /&abcdef/ {if(prev==0) {prev=NR;line=$0} else {if((prev+1)==NR) {print FILENAME ":" NR-1;print FILENAME ":" NR}; prev=NR; line=$0}}' file-a

【讨论】:

  • 感谢您的快速响应,只有在连续行中多次出现 &abcdef 时才会打印输出,并带有行号和文件名,因为我必须对多个文件执行此操作。
  • 只需要打印文件名和行号吗?还是您还需要打印这些行?
  • 再次感谢并感谢。由于我在一个目录中有多个(数千个)文件,因此我必须为每个文件执行此活动(搜索)并打印该文件的行号,其中包含连续行中出现的“&abcdef”。
  • 我是否可以建议删除 EDIT 一词,并在您进行时简单地阐述替代方案。您将它们作为编辑进行这一事实很好,但从长远来看并不相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
相关资源
最近更新 更多