Bash

如何計算目錄中每個文件的行數,然後創建包含 n 行的文件數的摘要

  • August 27, 2022

我正在嘗試創建一個目錄中有多少文件的摘要,其中包含 n 行。我wc -l * | sort用來根據每個文件的名稱列印出行數。我想要實現的是對將產生的目錄的摘要:

56 5
60 6
3  7

等等,其中第一列代表文件數,第二列代表行數。

我查看了一個 awk 命令awk 'END{print NR}' directory/*,它返回整個目錄中的行數。我已經考慮過printf格式化wc -l輸出的解決方案。任何幫助將不勝感激!謝謝

假設您的“wc -l *”以您需要的方式計算行數,例如沒有有趣的文件名,那麼您可以使用 uniq -c 為您計算行數。head -n -1 是為了去掉末尾的“total”行:

wc -l *|head -n -1|sort|awk '{print $1}'|uniq -c

使用 GNU awk,您可以:

find . -type f -print0 | gawk '
 BEGIN {
   RS = "\0"
   while ((getline < "-") > 0) ARGV[ARGC++] = $0
   if (ARGC == 1) exit
   RS = "\n"
 }
 ENDFILE {count[FNR]++}
 END {
   PROCINFO["sorted_in"] = "@ind_num_asc"
   for (i in count) print count[i], i
 }'

我們在 BEGIN 語句中設置要處理的文件列表,方法是從find -print0的輸出中讀取以 NUL 分隔的文件。

或相同perl(注意空文件被忽略):

find . -type f -print0 | perl -0 -ne '
 BEGIN{@ARGV = <STDIN>; $/ = "\n"}
 if (eof) {$count{$.}++; close ARGV}
 END {print "$count{$_} $_\n" for sort {$a <=> $b} keys %count}'

請注意,這些計算行數,無論是否分隔,同時wc -l計算換行符的數量。例如,對於使用printf foo > filewherewc -l將報告 0 但perl/ gawk1 創建的文件,這會有所不同。

使用wcPOSIXly,您可以執行以下操作:

find .//. -type f -exec wc -l {} + | LC_ALL=C awk '
 /\/\// {count[$1]++}
 END {for (i in count) print count[i], i}' | sort -k2n

通過使用.//.,我們可以判斷文件路徑在輸出中的哪一行開始wc(因為//不能出現在其他任何地方),並且行數將是該行的第一個欄位,因此我們可以可靠地處理包含換行符的文件路徑。這也跳過了傳遞多個參數的呼叫在最後列印的total行,因為它不包含.wc``//

使用 GNUgrep或兼容的,您還可以執行以下操作:

LC_ALL=C grep -rch '^' . | sort -n | uniq -c

我們c計算匹配的行數,^即有一個開頭,所以所有文件中的所有行,r遞歸地在 中.-h跳過列印文件名。LC_ALL=C不必費心將內容解碼為文本(grep鑑於該正則表達式,GNU 至少可能會優化該解碼)。

請注意,所有這些也計算隱藏文件。

要跳過它們,您可以將find命令更改為:

LC_ALL=C find . -name '.?*' -prune -o -type f -print0

GNU 沒有等價物grep -r,儘管您可以刪除-r並將find文件列表傳遞給grep

LC_ALL=C find . -name '.?*' -prune -o -type f -exec grep -ch {} +

引用自:https://unix.stackexchange.com/questions/715068