【问题标题】:GREP lines from file in another file until occurence of a certain character另一个文件中的文件中的 GREP 行,直到出现某个字符
【发布时间】:2017-03-14 22:46:28
【问题描述】:
grep -A 10 -f smallfile bigfile

greps 从 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 执行此操作的方法,但我无法使其按我想要的方式工作。

非常感谢!

【问题讨论】:

  • 为什么不切换到更高级的工具,例如awkperl
  • csplit bigfile /^\@/
  • @DragonRider,在标准的 gnu grep 中似乎没有这样的选项:git.savannah.gnu.org/cgit/grep.git/tree/src/grep.c#n1301prtext .. pending = out_quiet ? 0 : MAX (0, out_after); .. prpending,这里的 lim 只是指向缓冲区末尾的指针。单一模式的 AWK 解决方案:stackoverflow.com/questions/29180929 & perl multiline regexp in grep & sed too.
  • @osgx 谢谢,你认为 -A 标志可能与 -m 一起使用,比如 grep -A 9999999 -m @ -f smallfile bigfile,我尝试了几种方法,但都没有成功
  • @jm666 谢谢,你知道如何将 csplit 通过管道传送到这个 grep 命令中吗?

标签: linux bash grep


【解决方案1】:

使用 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 到达时执行(相当于 condition==1/true)
对于给定的条件,可以省略操作。在这种情况下,将执行默认操作 = print $0

【讨论】:

  • 您好,非常感谢。我之前写过我需要为 smallfile 的数百行执行此操作,但现在让我的示例更加清晰
  • George,它是某种codegolf.stackexchange.com 编程语言吗?
  • @osgx 伙计,我喜欢 codegolf!我还在努力让它变小!
  • @osgx 开玩笑的,不,它是经典的 awk - 适用于所有系统。它只是有自己的语法,是一种非常棒的文本处理语言。
  • @DragonRider 好吗?可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2017-03-05
  • 2017-06-15
相关资源
最近更新 更多