ファイル内のテキスト行数(区切られていないテキストを含む)を計算する方法はありますか?

ファイル内のテキスト行数(区切られていないテキストを含む)を計算する方法はありますか?

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

おすすめ記事