
POSIXwc
コマンドは、ファイルの POSIX 行数を計算します。 POSIX 標準は以下を定義します。ワイヤー接尾辞付きのテキスト文字列\n
。それがなければ、\n
プレーンテキスト文字列は行と呼ばれません。
しかし、私には、ファイルに何行のテキスト文字列があるかを計算する方が自然に感じます。これを行う簡単な方法はありますか?
root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#
答え1
GNUでは、sed
次のことができます。
sed '$=;d'
これは、GNUがsed
最後の改行の後の追加の文字を追加の行として扱うためです。ほとんどのGNUユーティリティと同様に、GNUはsed
入力時にNUL文字をサポートし、行の長さに制限はありません(どちらの条件もPOSIXに従って入力をテキストではないものにします)。
POSIXlyベース@Inianの答え過度に長い行とNULバイトをサポートします。
LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'
このtr
コマンドは、改行文字(デコードの問題を避けるために、各バイトはCロケールの文字として解釈されます)を除く1つ以上の文字で構成されるすべてのシーケンスを次に変換します。一つ x
文字であるため、awk
入力レコードの長さは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
答え2
これは利用可能であり、ファイルの先頭から現在のレコード数を追跡するawk
特別な変数があります。NR
この変数は各行の終わりにインクリメントされます。ブロックに印刷するときEND
、つまりすべての入力行を処理した後、最後に処理されたレコードの番号を印刷します。
printf "aa\nbb" | awk 'END { print NR }'
2
printf "aa\nbb\n" | awk 'END { print NR }'
2