假设我有一个包含几百万行的文件,组织如下:
@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/