繁体   English   中英

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

[英]How can I print 2 lines if the second line contains the same match as the first line?

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

@1:N:0:ABC
XYZ

@1:N:0:ABC
ABC

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

当我尝试使用grep -A1 -P并将匹配与'(?<=:)[AZ]{3}'匹配时,我陷入困境。 我觉得我的创造力让我失望了。

awk

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


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

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

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

@1:N:0:ABC
@1:N:0:XYZ
XYZ

如果您的实际Input_file与显示的示例相同,那么下面的内容也可以帮助您。

awk -v FS="[: \n]" -v RS="" '$(NF-1)==$NF'  Input_file

编辑:根据Sundeep的建议,在此添加1个解决方案。

awk -v FS='[:\n]' -v RS= 'index($NF, $(NF-1))' Input_file

这可能适合你(GNU sed):

sed -n 'N;/.*:\(.*\)\n.*\1/p;D' file

使用类似grep的选项-n来显式打印行。 在模式空间中读取两行,如果符合要求则打印两行。 始终删除第一个并重复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM