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这样的标志来做但我无法按照我想要的方式工作。
非常感谢!
答案 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