wc -l file.txt
行数とファイル名を出力します。
番号だけが必要です(ファイル名ではありません)。
私がすることができます
wc -l file.txt | awk '{print $1}'
しかし、おそらくもっと良い方法がありますか?
この方法を試してください:
wc -l < file.txt
cat file.txt | wc -l
manページ (BSDバージョンの場合、チェックするGNUバージョンはありません)によると:
ファイルが指定されていない場合、標準入力が使用され、ファイル名は表示されません。プロンプトは、EOF、またはほとんどの環境で[^ D]を受信するまで入力を受け入れます。
先行スペースなしでこれを行うには、次の理由があります。
wc -l < file.txt | bc
どう?
wc -l file.txt | cut -d' ' -f1
つまり、wc
の出力をcut
にパイプします(区切り文字はスペースで、最初のフィールドのみを選択します)
どう?
grep -ch "^" file.txt
wc
によって提供される先頭の空白なしで文字数を取得しようとすると、同様の問題が発生し、このページに移動しました。ここで答えを試した後、次はMac(BSD Bash)での個人的なテストの結果です。繰り返しますが、これは文字カウントのためです。行数についてはwc -l
を実行します。 echo -n
は末尾の改行を省略します。
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | Perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
一般的にcut -f*
メソッドには依存しません。これは、特定の出力に含まれる可能性のある先行スペースの正確な数を知っている必要があるためです。また、grep
は行をカウントするために機能しますが、文字はカウントしません。
bc
が最も簡潔であり、awk
とPerl
は少し使い過ぎに見えますが、それらはすべて比較的高速で十分に移植性が高いはずです。
また、これらのいくつかは、一般的な文字列から周囲の空白をトリムするように適応できることに注意してください(echo `echo $FOO`
とともに、別の巧妙なトリック)。
明らかに、これには多くの解決策があります。ただし、ここにもう1つあります。
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
これは行数のみを出力しますが、末尾の改行文字(\n
)が存在します。必要ない場合は、[:blank:]
を[:space:]
に置き換えます。
最善の方法は、最初にディレクトリ内のすべてのファイルを見つけてから、AWK NR(レコード数変数)を使用することです
以下はコマンドです:
find <directory path> -type f | awk 'END{print NR}'
例:-find /tmp/ -type f | awk 'END{print NR}'