bu5*_*man 11
如果空行只在最后
grep -c '^$' myFile
Run Code Online (Sandbox Code Playgroud)
或者:
grep -cx '' myFile
Run Code Online (Sandbox Code Playgroud)
Phi*_*pos 11
只是为了好玩,有些诡异sed
:
#!/bin/sh
sed '/./!H;//h;$!d;//d;x;s/\n//' "$1" | wc -l
Run Code Online (Sandbox Code Playgroud)
解释:
/./
寻址具有任何字符的行,因此/./!
寻址非空行;对于那些,H
命令将它们附加到保留空间。因此,如果对于每个空行,我们向保留空间添加了一行,则总是比空行数多一行。我们稍后会关心这个。//h
空模式匹配最后一个正则表达式,它是任何字符,因此任何非空行都被寻址并通过命令移动到保持空间以h
将收集的行“重置”为 1。当下一个空行将被追加时,正如预期的那样,还会有两个。$!d
停止脚本而不输出除最后一行之外的每一行,因此仅在最后一行之后执行进一步的命令。因此,我们在保留空间中收集的任何空行都位于文件末尾。好的。//d
: 该d
命令仅对非空行再次执行。所以如果最后一行不为空,sed
将退出而没有任何输出。零线。好的。x
交换持有空间和模式空间,所以收集的行现在在模式空间中进行处理。s/\n//
。wc -l
.更多的 GNU tac
/tail -r
选项:
tac file | awk 'NF{exit};END{print NR?NR-1:0}'
Run Code Online (Sandbox Code Playgroud)
或者:
tac file | sed -n '/[^[:blank:]]/q;p' | wc -l
Run Code Online (Sandbox Code Playgroud)
请注意,关于输出:
printf 'x\n '
Run Code Online (Sandbox Code Playgroud)
也就是说,在最后一行之后有一个额外的空格(有些人可以认为是一个额外的空行,但根据文本的 POSIX 定义,不是有效的文本),那些将给出 0。
POSIXly:
awk 'NF{n=NR};END{print NR-n}' < file
Run Code Online (Sandbox Code Playgroud)
但这意味着完整读取文件(tail -r
/tac
会从可查找文件的末尾向后读取文件)。这给出1
了 的输出printf 'x\n '
。
由于您实际上是在寻求grep
解决方案,因此我添加了这个仅依赖于 GNU的解决方案grep
(好吧,也使用 shell 语法和echo
...):
#!/bin/sh
echo $(( $(grep -c "" "$1") - $(grep -B$(grep -cv . "$1") . "$1" |grep -c "") ))
Run Code Online (Sandbox Code Playgroud)
我在这是要干嘛?$(grep -c ".*" "$1")
计算文件中的所有行,然后我们减去文件,不带尾随空行。
以及如何获得这些?$(grep -B42 . "$1"
将 grep 所有非空行和它们之前的 42 行,因此它会打印所有内容,直到最后一个非空行,只要在非空行之前不超过 42 个连续的空行。为了避免这个限制,我把$(grep -cv . "$1")
这个-B
选项作为参数,它是空行的总数,所以总是足够大。这样我就去掉了尾随的空行,可以|grep -c ".*"
用来计算行数。
很棒,不是吗?(-;
另一种awk
解决方案。k
每次出现非空行时,此变化都会重置计数器。然后,每一行都会增加计数器。(因此,在第一个非空白长度的行之后,k==0
.)最后我们输出我们计算的行数。
准备数据文件
cat <<'X' >input.txt
aaa
bbb
ccc
X
Run Code Online (Sandbox Code Playgroud)
计算样本中的尾随空行
awk 'NF {k=-1}; {k++}; END {print k+0}' input.txt
3
Run Code Online (Sandbox Code Playgroud)
在此定义中,空行可能包含空格或其他空白字符;它仍然是空白的。如果您真的想计算空行而不是空行,请更改NF
为$0 != ""
.
计算文件末尾连续空白行的数量
固体awk
+tac
溶液:
样本input.txt
:
$ cat input.txt
aaa
bbb
ccc
$ # command line
Run Code Online (Sandbox Code Playgroud)
那个行动:
awk '!NF{ if (NR==++c) { cnt++ } else exit }END{ print int(cnt) }' <(tac input.txt)
Run Code Online (Sandbox Code Playgroud)
!NF
- 确保当前行为空(没有字段)NR==++c
- 确保空行的连续顺序。( NR
- 记录数,++c
- 均匀递增的辅助计数器)cnt++
-空行计数器输出:
3
Run Code Online (Sandbox Code Playgroud)