計算文件末尾的空白行數

計算文件末尾的空白行數

我有一個文件末尾有空行的文件。我可以使用grep檔案名稱作為腳本中的變數傳遞來計算檔案末尾的空白行數嗎?

答案1

如果空行是僅有的在最後

grep  -c '^$' myFile

或者:

grep -cx '' myFile

答案2

只是為了好玩,有些令人毛骨悚然sed

#!/bin/sh
sed '/./!H;//h;$!d;//d;x;s/\n//' "$1" | wc -l

解釋:

  • /./尋址具有任何字元的行,因此/./!尋址空行(例如/^$/,但我想重複使用相反的模式);對於這些,該H命令將它們附加到保留空間。因此,如果我們為每個空行添加一行到保留空間,則總是比空行的數量多一行。我們稍後會關心這個。
  • //h空模式匹配最後一個正則表達式,它是任何字符,因此任何非空行都會被尋址並且搬家了透過指令將收集的行「重設」為 1 到保留空間h
  • $!d停止腳本,除了最後一行之外的每一行都沒有輸出,因此僅在最後一行之後執行進一步的命令。因此,我們在保留空間中收集的任何空白行都位於文件的末尾。好的。
  • //dd僅對非空白行再次執行該指令。因此,如果最後一行不為空,sed將退出且沒有任何輸出。零線。好的。
  • x交換保存空間和模式空間,因此收集到的行現在位於模式空間中處理。
  • 但我們記得一行太多了,所以我們用 刪除一個換行符來減少它s/\n//
  • 瞧!行數與末尾的空行數相符(注意第一行不會為空,但誰在乎呢),所以我們可以用 來計數wc -l

答案3

更多 GNU tac/tail -r選項:

tac file | awk 'NF{exit};END{print NR?NR-1:0}'

或者:

tac file | sed -n '/[^[:blank:]]/q;p' | wc -l

請注意,在輸出上:

printf 'x\n '

也就是說,如果最後一個整行後面有一個額外的空格(有些人可能會將其視為額外的空行,但根據 POSIX 文字定義,不是有效文字),則這些空格將為 0。

POSIXly:

awk 'NF{n=NR};END{print NR-n}' < file

但這意味著完整讀取文件(tail -r/tac將從可查找文件的末尾向後讀取文件)。這給出1了 的輸出printf 'x\n '

答案4

因為你實際上是在要求grep解決方案我添加這個僅依賴 GNU grep(好吧,也使用 shell 語法和echo...):

#!/bin/sh
echo $(( $(grep -c "" "$1") - $(grep -B$(grep -cv . "$1") . "$1" |grep -c "") ))

我在這是要幹嘛?$(grep -c ".*" "$1")計算檔案中的所有行,然後減去不帶尾隨空行的檔案。

以及如何獲得這些?$(grep -B42 . "$1"會 grep 所有非空白行和它們之前的 42 行,因此只要非空白行之前不超過 42 個連續空白行,它就會列印直到最後一個非空白行的所有內容。為了避免這個限制,我將空白行的總數$(grep -cv . "$1")作為選項的參數,因此總是足夠大。-B這樣我就去掉了尾隨的空白行,並且可以用來|grep -c ".*"計算行數。

太棒了,不是嗎? (-;

相關內容