[英]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
:
$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.