除了模式和接下来的n行之外,我怎样才能获得所有内容?

Nik*_*ide 1 regex bash shell grep

我有一个文件:

NAMES.DAT:

AAAA
BBBB
Run Code Online (Sandbox Code Playgroud)

text.dat:

AAAA
CTGCTTCGTCA
12127567612
BBBB
TCGACTACTAG
12331276318
CCCC
TCATCATACAT
23612763812
DDDD
GCTATCGCATC
23767263723
Run Code Online (Sandbox Code Playgroud)

我想要做的是(仅使用shell命令)从text.dat中排除这些行,这些行也存在于names.dat中,并且(最重要的是)在公共行之后有三行.

所以基本上输出应该看起来像是:

CCCC
TCATCATACAT
23612763812
DDDD
GCTATCGCATC
23767263723
Run Code Online (Sandbox Code Playgroud)

Tom*_*ech 6

你可以用awk做到这一点:

awk 'NR==FNR {a[$0]; next} $0 in a {i=0} ++i>3' names.dat text.dat
Run Code Online (Sandbox Code Playgroud)

NR==FNR表示总记录数等于当前文件的记录号(这仅适用于第一个文件).使用行names.dat来设置数组中的键a.next跳到输入的下一行,忽略单行中的任何其他命令.每当一行text.dat与一个元素相匹配时a,计数器i将重置为0.只有当行i大于3 时才会打印.

测试出来:

$ awk 'NR==FNR {a[$0]; next} $0 in a {i=0} ++i>3' names.dat text.dat 
CCCC
TCATCATACAT
23612763812
DDDD
GCTATCGCATC
23767263723
Run Code Online (Sandbox Code Playgroud)