grep匹配后如何计算文件中的行数?


14

我正在尝试计算csv文件中有问题的行之后的行数。我知道grep -a #在找到匹配项后,可以使用语法输出#行数。我只对实际的行数感兴趣。我意识到我可以将数字设置为MAX_INT,将其传送到文件中并进行更多处理。

我正在寻找简洁的单线飞机,以告诉我人数。

有什么建议么?

Answers:


15
{ grep -m1 match; grep -c ''; } <file

这将与GNU grep和一个有lseek()能力的文件一起工作。第一grep行将在1 -m跳停止,第二行将-c在输入中剩余的每一行进行测距。

没有GNU grep

{ sed '/match/q'; grep -c ''; } <file

当然,grep除了您可以使用其任何/所有其他其他选项外,完全不必停止一场比赛。


这两个都可以打印该行,第二个可以打印到第一个匹配,然后对我来说为0?
2015年

@ User112638726-您当然可以删除第一个匹配项的打印输出grep -m1 match >/dev/null。第二个问题是GNU- sed它不会按规范重置其输入偏移。您必须使用-u带有GNU的软件-并非总是如此。我可以更清楚一些,但是我的假设是GNU grep和GNU sed将成对出现。我认为,也grep -qm1可以使用这种方法来缩短/dev/null重定向的速度-但是GNU grep确实有一些奇怪的事情,-q而且我不记得这两者是如何一起工作的。
mikeserv 2015年

1
好的答案-确实展示了命令分组的功能。我不确定,但是我想wc -l比便宜一点grep -c ''
Digital Trauma

1
@DigitalTrauma-是的,我想起来(回想起来),但是我已经写了,而且几乎押韵,所以我想我一个人可以放任自流。而且,无论如何,您也说了,所以我现在就轻松入睡。
mikeserv

9

这是一种方法。

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$

4
这不是代码高尔夫,您可以提供详细信息(FNR,END等)吗?
Archemar 2015年

3
当然。awk使用FNR标识输入记录号。END是到达文件末尾时执行的代码。因此,当找到匹配项时,将记录当前记录号。到达文件末尾时,将从文件中的总行数中减去该数字。
史蒂夫2015年

1
也可以只使用NR,因为它是一个文件。
2015年

6

另一种方式-使用dc有点深奥,但在这里似乎很好用:

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sed搜索prob.txt“问题”和最后一行,并使用=命令输出两者的行号。

dc 将这两个值读到堆栈上,将它们取反,求和并打印差异。


5

完全使用sed(尽管两个命令带有管道)

sed '/ddd/,$!d' file | sed -n '$='

删除该行之前的所有行,然后下一个命令对新文件中的行进行计数。


3

这应该删除直到(包括)有问题的所有行,然后计算剩余的行:

sed '1,/problem/d' data.txt | wc -l

1
(假设“问题”是不是在第一行)
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.