计算文件末尾的空行数

Rag*_*ary 11 grep text-processing wc

我有一个文件末尾有空行的文件。我可以使用grep在脚本中作为变量传递的文件名来计算文件末尾的空行数吗?

bu5*_*man 11

如果空行在最后

grep  -c '^$' myFile
Run Code Online (Sandbox Code Playgroud)

或者:

grep -cx '' myFile
Run Code Online (Sandbox Code Playgroud)

  • @Philippos,`grep -cv .` 也会计算只包含不构成有效字符的字节的行。 (2认同)

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.


Sté*_*las 8

更多的 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 '


Phi*_*pos 6

由于您实际上是在寻求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 ".*"用来计算行数。

很棒,不是吗?(-;


roa*_*ima 5

另一种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 != "".


Rom*_*est 2

计算文件末尾连续空白行的数量

固体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)