ディレクトリ内の各ファイルの行数を計算し、n個のファイル行の要約を作成する方法

ディレクトリ内の各ファイルの行数を計算し、n個のファイル行の要約を作成する方法

ディレクトリにn行のファイル数の要約を作成しようとしています。wc -l * | sort各ファイル名の行数を印刷するために使用しています。私が達成したいのは、以下を生成するディレクトリの要約です。

56 5
60 6
3  7

最初の列はファイル数を表し、2番目の列は行数を表します。

awk 'END{print NR}' directory/*ディレクトリ全体の行数を返すawkコマンドを見ました。出力printfフォーマットを指定wc -lするソリューションを検討しました。どんな助けでも大変感謝します!ありがとう

ベストアンサー1

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
  }'

find -print0の出力からNULで区切られたファイルを読み取り、BEGINステートメントで処理するファイルのリストを設定します。

または次のようになります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改行も計算します。たとえば、whereを使用してprintf foo > file生成されたファイルはwc -l0を報告しますが、perl/ gawk1を報告するため、違いがあります。

POSIXlyを使用すると、wc次のことができます。

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繰り返さ.れます。コンテンツをテキストにデコードすることに気を付けないでください(正規表現を考慮すると、GNUは少なくともそのデコードを最適化します)。-hLC_ALL=Cgrep

これらはすべて隠しファイルにも含まれます。

これをスキップするには、コマンドをfind次のように変更できます。

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

grep -r-rファイルリストを削除して次に渡すことはできますが、findGNUに対応するものはありませんgrep

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

おすすめ記事