grep -A 10 -f smallfile bigfile
从小文件中提取大文件中的每一行以及接下来的 10 行
是否有可能通过使用另一个标志而不是 -A 来继续搜索以下行,直到在大文件中出现一个字符(比如说@),我需要从小文件中为数百行做这件事,我有不知道我需要 grep 的 smallfile 行之后有多少行,它会针对每一行进行更改。仅说明其中一行的示例:
小文件:
@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 脚本或更复杂的循环,但我相信应该有一个使用像 -m 这样的标志让 grep 执行此操作的方法,但我无法使其按我想要的方式工作。
非常感谢!
最佳答案
与 grep 相比,awk 可以更好地处理这项工作。 波纹管脚本在我的测试中似乎工作正常:
$ 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 串行读取文件
条件可以省略,直接写action。在这种情况下,总是在 awk 到达时执行操作(相当于 condition==1/true)
对于给定条件,可以省略操作。在这种情况下,将执行默认操作 = print $0
关于linux - GREP 从文件到另一个文件的行,直到出现某个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42797972/