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

标签 linux bash grep

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/

相关文章:

bash - 如何删除整个文件中的双行,省略每行中的前 n 个字符?

linux - 如何 grep 查找文件中的某个键?

linux - 在 IP 末尾检测 0,最后一个八进制/bash

java - 在 Linux 中开发有吸引力的图形用户界面

bash - 为什么这种花括号和双引号的组合在 bash 中不起作用?

linux - sed 在 bash 脚本中不工作

python - 无法解析参数

linux - 关于 Linux Mint 17.2 上的 Tkinter python 2.76

python - 在文件中突出但不完全重复的行

regex - 使用 -f 选项的 grep 或 fgrep 没有输出不起作用