如何計算目錄中每個文件的行數,然後創建包含 n 行的文件數的摘要
我正在嘗試創建一個目錄中有多少文件的摘要,其中包含 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 > file
wherewc -l
將報告 0 但perl
/gawk
1 創建的文件,這會有所不同。使用
wc
POSIXly,您可以執行以下操作: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``//
使用 GNU
grep
或兼容的,您還可以執行以下操作: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 {} +