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

标签 regex bash awk sed grep

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

@1:N:0:ABC
XYZ

@1:N:0:ABC
ABC

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

当我尝试使用 grep -A1 -P 时并用 '(?<=:)[A-Z]{3}' 之类的匹配项来传递匹配项,我卡住了。我认为我的创造力在这里让我失望了。

最佳答案

使用 awk

$ awk -F: 'NF==1 && $0 ~ s{print p ORS $0} {s=$NF; p=$0}' ip.txt
@1:N:0:ABC
ABC
  • -F: 使用: 作为分隔符,可以轻松获取最后一列
  • s=$NF; p=$0 保存最后一列值和整行以供稍后打印
  • NF==1 如果行不包含 :
  • $0 ~ s 如果行包含先前保存的最后一列数据
    • 如果搜索数据可以包含正则表达式元字符,则使用 index($0,s) 进行字面搜索
  • 请注意,此代码假定输入文件包含包含 : 的行,后跟不包含 :
  • 的行


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

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

再次,这假设输入如问题所示..这不适用于像

这样的情况
@1:N:0:ABC
@1:N:0:XYZ
XYZ

关于regex - 如果第二行包含与第一行相同的匹配项,我如何打印 2 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49728490/

相关文章:

javascript - 字符串替换

python - 在 Python 字符串中查找重复模式

java - startsWith endsWith 匹配包含正则表达式

linux - 在 shell 脚本中使用 echo 丢失字符

python - 使用 pandas.read_csv 的 na_values 正则表达式

linux - bash 文件中的 shell 函数

mysql - AWS Ubuntu 14.04 上的无人值守 MySQL 安装

linux - 如何在 awk 中运行 grep?

string - Bash 拆分字符串

linux - 将位置参数给出的文件中的所有数字相加