大きなcsvファイルを含むディレクトリとサブディレクトリのリストがあります。これらのファイルには約5億行あり、それぞれがレコードです。私が知りたいのですが
最も重要なのは、これを「人間が読める形式」で必要とすることです。 12345678ではなく12,345,678
これを3つの方法で行う方法を学ぶのは良いことです。プレーンバニラbashツール、awkなど、Perl(またはpython)。
各ファイルの行数。
wc
を使用してください。元々は単語数をカウントするためだと思いますが、行、単語、文字、バイト、および最長の行の長さを実行できます。 -l
オプションは、行を数えるように指示します。
wc -l <filename>
これは行数を出力します:
$ wc -l /dir/file.txt
32724 /dir/file.txt
データをwc
にパイプすることもできます。
$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63
ディレクトリに何行あるか。
試してください:
find . -name '*.pl' | xargs wc -l
別のワンライナー:
( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l
ところで、wc
コマンドは、行ではなく新しい行コードをカウントします。ファイルの最後の行が新しい行コードで終わっていない場合、これはカウントされません。
完全な例であるgrep -c ^を使用できます。
#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
#you see use grep instead wc ! for properly counting
count=$(grep -c ^ < "$FILE")
echo "$FILE has $count lines"
let total=total+count #in bash, you can convert this for another Shell
done
echo TOTAL LINES COUNTED: $total
合計行数
あなたが正しくリクエストしたことを私が理解したかどうかはわかりません。例えばこれにより、各ファイルの行数を示す次の形式で結果が出力されます。
# wc -l `find /path/to/directory/ -type f`
103 /dir/a.php
378 /dir/b/c.xml
132 /dir/d/e.xml
613 total
または、次のコマンドにファイルごとのカウントなしで改行文字の総数のみを出力することは、有用であると証明できます。
# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
613
最も重要なのは、これを「人間が読める形式」で必要とすることです。 12345678ではなく12,345,678
Bashには printf 関数が組み込まれています。
printf "%0.2f\n" $T
いつものように、ここで述べた同じ結果を達成するために使用できる多くの異なる方法があります。
多くの場合、wc
コマンドとワイルドカード*
を組み合わせれば十分です。
すべてのファイルが1つのディレクトリにある場合は、次のように呼び出すことができます。
wc -l src/*
複数のファイルとディレクトリを一覧表示することもできます。
wc -l file.txt readme src/* include/*
このコマンドは、ファイルとその行数のリストを表示します。
最後の行は、すべてのファイルの行の合計になります。
ディレクトリ内のすべてのファイルを再帰的にカウントするには:
最初に、shopt -s globstar
を.bash_profileに追加して、globstarを有効にします。 globstarのサポートには、必要に応じてbrew install bash
でインストールできるBash≥4.xが必要です。バージョンはbash --version
で確認できます。
次に実行します:
wc -l **/*
Globstarが有効になっていない場合、この出力は正しくないことに注意してください。
このコマンドは、各ディレクトリの行コードのリストを提供します:
find . -name '*.*' -type f | xargs wc -l
ゲームには少し遅れましたが、dirのサイズが原因で、上記の引数エラーがたくさん発生しました。これは私のために働きました:
for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt
cat
はファイルを1つに結合し、すべてを標準出力に出力します。wc -l
ディレクトリ内のファイルの行数の合計について:
cat /path/to/directory/* | wc -l
@malyyの回答を次のように拡張します(コメントを大きくする)。
合計行数
多くの答えは、wc
コマンドラインファイルオプションをxargs
とともに使用しています。これに関する問題は、xargsがかなり小さいプラットフォーム依存サイズに制限されていることです。
さらに、BSD(macOS)とGNU(linux/homebrew)wc
の間には違いがあります。
GNU oneは、引数(--files0
)。
Macを使用していて自作がある場合は、次のことを行う必要があります。
find . -name "*.pl" -print0 | gwc -l --files0=-
wcの代わりにgwcに注意。