Linux GREP从另一个文件中的文件中删除行,直到出现某个字符

Linux GREP从另一个文件中的文件中删除行,直到出现某个字符,linux,bash,grep,Linux,Bash,Grep,greps bigfile中smallfile的每一行,以及接下来的10行 是否可以通过使用另一个标志而不是-A来保持以下行的灰显,直到在大文件中出现一个字符(比如@),并且我需要对smallfile中的数百行进行灰显,并且我不知道需要对smallfile中的行进行灰显的行数,每行都会发生变化。示例仅演示其中一行: 小型文件: grep -A 10 -f smallfile bigfile 大文件: @123 @555 所以我想让它给我这个 @123 abc def ghj @789 sdf

greps bigfile中smallfile的每一行,以及接下来的10行

是否可以通过使用另一个标志而不是-A来保持以下行的灰显,直到在大文件中出现一个字符(比如@),并且我需要对smallfile中的数百行进行灰显,并且我不知道需要对smallfile中的行进行灰显的行数,每行都会发生变化。示例仅演示其中一行:

小型文件:

grep -A 10 -f smallfile bigfile
大文件:

@123
@555
所以我想让它给我这个

@123
abc
def
ghj
@789
sdf
tyu
rzx
@555
yui
wer
@435
teg
gdgd
如果您知道从一个文件到另一个文件中“grepping”行的另一种方法,也可以做到这一点,我可能会尝试编写一个python脚本或更复杂的循环,但我相信应该有一种方法可以让grep使用-m这样的标志来做到这一点,但我就是无法让它以我想要的方式工作


非常感谢

与grep相比,awk更好地处理此作业。 下面的脚本在我的测试中似乎运行正常:

@123
abc
def
ghj
@555
yui
wer
甚至:

$ awk 'NR==FNR{a[$0];next}$0 in a{print;f=0;next} \
{if ($0 !~ /^@/ && f!=1) {print} else {f=1}}' smallfile bigfile
说明:
awk脚本基于模式
'condition1{action1}condition2{action2}等

FNR
=打开文件行号(读取下一个文件时重置)
NR
=全局行号-在所有文件中不断增加
|
=或逻辑运算符
$0
=整行
a[$0]
=使用$0作为键/索引初始化数组
a中的$0
=检查$0(整行)是否是数组a的键/索引
$0~/^@/=$0与regex/^@/=不以@开头不匹配
next
=读取下一行
awk以串行方式读取文件 可以编写条件,也可以直接编写操作。在这种情况下,总是在awk到达时执行操作(相当于条件==1/true)

可以针对给定条件执行操作。在这种情况下,将执行默认操作=print$0

为什么不切换到更高级的工具,如
awk
&
perl
csplit bigfile/^\/
@DragonRider,在标准gnu grep:
prtext中似乎没有这样的选项。。挂起=不安静?0:MAX(0,out_后)。。prpending
这里的lim只是指向缓冲区末尾的指针。单个模式的AWK解决方案:&perl多行regexp也在grep&sed中。@osgx谢谢,你认为-A标志可以与-m一起使用吗,比如grep-A 999999-m@-f smallfile bigfile,我尝试了几种方法但没有work@jm666谢谢,你知道如何将csplit导入这个grep命令吗?嗨,非常感谢。我以前写过,我需要在smallfile中的数百行中使用它,但现在我的示例更加清晰了乔治,它是某种编程语言吗?@osgx人,我喜欢codegolf!我还在努力把它变小@osgx装置从笑话,不,它是经典的awk-在所有系统中可用。它只是有自己的语法,是一种非常棒的文本处理语言。@DragonRider好吗?行吗?
awk 'NR==FNR{a[$0];next}$0 in a || ($0 !~ /^@/ && f!=1){print;f=0;next}{f=1}' file1 file2