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

Nat*_*tie 14 grep csv files

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

我正在寻找一个简洁的单线来告诉我计数。

有什么建议?

mik*_*erv 15

{ grep -m1 match; grep -c ''; } <file
Run Code Online (Sandbox Code Playgroud)

这将适用于 GNUgrep和一个有lseek()能力的 infile。第一个grep将在 1 个-m匹配处停止,第二个将计算-c输入中剩余的每一行。

没有 GNU grep

{ sed '/match/q'; grep -c ''; } <file
Run Code Online (Sandbox Code Playgroud)

当然,grep除此之外,您还可以使用任何/所有其他选项,并且完全没有必要在一场比赛中停下来。


ste*_*eve 9

这是一种方法。

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$
Run Code Online (Sandbox Code Playgroud)

  • 这不是 codegolf,您能否提供详细信息(FNR、END 等)? (4认同)
  • 当然。awk 使用 FNR 来识别输入记录号。END 是到达文件末尾时执行的代码。因此,当找到匹配项时,会记录当前记录号。到达文件末尾时,将从文件中的总行数中减去该数字。 (3认同)

Dig*_*uma 6

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

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'
Run Code Online (Sandbox Code Playgroud)

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

dc 将这两个值读入堆栈,反转它们,减去并打印差异。


123*_*123 5

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

sed '/ddd/,$!d' file | sed -n '$='
Run Code Online (Sandbox Code Playgroud)

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