我正在尝试计算 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
除此之外,您还可以使用任何/所有其他选项,并且完全没有必要在一场比赛中停下来。
这是一种方法。
$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$
Run Code Online (Sandbox Code Playgroud)
另一种方式 - 使用dc
有点深奥,但似乎在这里工作得很好:
sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'
Run Code Online (Sandbox Code Playgroud)
sed
搜索prob.txt
“problem”和最后一行,并使用=
命令输出两者的行号。
dc
将这两个值读入堆栈,反转它们,减去并打印差异。
完全使用 sed(尽管是两个带管道的命令)
sed '/ddd/,$!d' file | sed -n '$='
Run Code Online (Sandbox Code Playgroud)
删除该行之前的所有行,然后下一个命令计算新文件中的行数。