如果第二行包含与第一行相同的匹配,如何打印2行?

Rya*_*ard 4 regex bash awk grep sed

假设我有一个包含数百万行的文件,组织如下:

@1:N:0:ABC
XYZ

@1:N:0:ABC
ABC
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一行grep/sed/awk匹配函数,如果NCCGGAGA在第二行找到第一行的行,则返回两行.

当我尝试使用grep -A1 -P匹配匹配的比赛时'(?<=:)[A-Z]{3}',我卡住了.我觉得我的创造力让我失望了.

Sun*_*eep 6

awk

$ awk -F: 'NF==1 && $0 ~ s{print p ORS $0} {s=$NF; p=$0}' ip.txt
@1:N:0:ABC
ABC
Run Code Online (Sandbox Code Playgroud)
  • -F:使用:作为分隔符,可以很容易地得到最后一列
  • s=$NF; p=$0 保存最后一列值和整行以便稍后打印
  • NF==1 如果行不包含 :
  • $0 ~ s 如果line包含先前保存的最后一列数据
    • 如果搜索数据可以包含正则表达式元字符,请改用index($0,s) 字面搜索
  • 请注意,此代码假定输入文件的行包含:后跟没有的行:


使用GNU sed(可能也适用于其他版本,但语法可能会有所不同)

$ sed -nE '/:/{N; /.*:(.*)\n.*\1/p}' ip.txt
@1:N:0:ABC
ABC
Run Code Online (Sandbox Code Playgroud)
  • /:/ 如果行包含 :
  • N 在模式空间中添加下一行
  • /.*:(.*)\n.*\1/最后捕获字符串:并检查它是否存在于下一行

再次,这假设输入如所示的..这不适用于像这样的情况

@1:N:0:ABC
@1:N:0:XYZ
XYZ
Run Code Online (Sandbox Code Playgroud)

  • 我之前在评论中要求澄清之前尝试了解决方案..所以在你发布新样本后,我添加了我的解决方案作为答案...我使用Ubuntu并且我总是打开终端..所以现场测试;)在线测试人员并不好,因为[工具的正则表达式与编程语言相比,有微妙而重要的方式] [https://unix.stackexchange.com/questions/119905/why-does-my-regular-expression-work-in-x - 丁未在-Y)... (2认同)