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

时间:2017-03-14 22:46:28

标签: linux bash grep

grep -A 10 -f smallfile bigfile

greps来自bigfile中的smallfile和接下来的10行

是否有可能通过使用另一个标志而不是-A来保持grepping以下行直到bigfile中出现一个字符(比如说@),我需要从smallfile中为数百行做这个,我有没有信息我需要grep的小文件行后面有多少行,它每个都有变化。示例只是说明其中一行:

小文件:

@123
@555

大文件:

@123
abc
def
ghj
@789
sdf
tyu
rzx
@555
yui
wer
@435
teg
gdgd

所以我希望它能给我这个

@123
abc
def
ghj
@555
yui
wer

如果你知道另一种方式" grepping"来自另一个文件中的一个文件的行可以做到这一点,这也可以工作,我可能会尝试编写一个python脚本或一个更复杂的循环,但我相信应该有一种方法让grep使用像-m这样的标志来做但我无法按照我想要的方式工作。

非常感谢!

1 个答案:

答案 0 :(得分:3)

使用awk比使用grep更好地处理这项工作。 在我的测试中,Bellow脚本似乎正常工作:

$ awk 'NR==FNR{a[$0];next}$0 in a{print;f=0;next} \
{if ($0 !~ /^@/ && f!=1) {print} else {f=1}}' smallfile bigfile

甚至:

awk 'NR==FNR{a[$0];next}$0 in a || ($0 !~ /^@/ && f!=1){print;f=0;next}{f=1}' file1 file2

说明:
awk脚本基于模式'condition1{action1}condition2{action2}etc'
FNR =打开文件行号(在读取下一个文件时重置)
NR =全球行号 - 在所有档案中不断增加 || = OR逻辑运算符
$0 =整线
a[$0] =使用$ 0初始化一个数组作为键/索引
$0 in a =检查$ 0(整行)是否是数组a的键/索引 $0 !~/^@/ = $ 0与正则表达式匹配/ ^ @ / =不以@
开头 next =读下一行
文件由awk串行读取 可以省略条件并且可以直接写入操作。在这种情况下,总是在awk到达时执行动作(相当于条件== 1 /真)
对于给定条件,可以省略动作。在这种情况下,将执行默认操作= print $ 0