POSIX wc
コマンドは、ファイル内のPOSIX行の数をカウントします。 POSIX標準では、lineを接尾辞\n
付きのテキスト文字列として定義しています。 \n
がないと、純粋なテキスト文字列を行と呼ぶことはできません。
しかし、私にとっては、ファイル内のテキスト文字列の行数を数えるのがより自然です。それを行う簡単な方法はありますか?
root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#
GNU sed
では、以下を使用できます。
sed '$=;d'
GNU sed
は、最後の改行の後の余分な文字を追加行と見なします。GNU sed
like like GNU utility入力でNUL文字もサポートし、行の長さに制限はありません(POSIXに従って入力を非テキストにする他の2つの基準)。
POSIXLy、長すぎる行とNULバイトをサポートするために @ Inianの答え を構築:
LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'
そのtr
コマンドは、改行以外の1つ以上の文字のシーケンス(デコードの問題を回避するためにCロケールで文字として解釈される各バイト)をonex
文字に変換するため、awk
inputレコードの長さは0または1バイトで、その入力にはx
と改行文字のみが含まれます。
$ printf '%10000s\na\0b\nc\nd' | wc -l
3
$ printf '%10000s\na\0b\nc\nd' | mawk 'END{print NR}'
2
$ printf '%10000s\na\0b\nc\nd' | busybox awk 'END{print NR}'
5
$ printf '%10000s\na\0b\nc\nd' | gawk 'END{print NR}'
4
$ printf '%10000s\na\0b\nc\nd' | LC_ALL=C tr -cs '\n' '[x*]' | mawk 'END{print NR}'
4
これにはawk
を使用できます。これには、ファイルの先頭から現在のレコードの数を追跡する特別な変数NR
があります。変数は各行の終わりで増分されます。 END
ブロックで出力されると、つまりすべての入力行が処理された後、最後に処理されたレコードの番号が出力されます。
printf "aa\nbb" | awk 'END { print NR }'
2
printf "aa\nbb\n" | awk 'END { print NR }'
2