web-dev-qa-db-ja.com

区切りのないものも含めて、ファイル内のテキストの行数をカウントする方法はありますか?

POSIX wcコマンドは、ファイル内のPOSIX行の数をカウントします。 POSIX標準では、lineを接尾辞\n付きのテキスト文字列として定義しています。 \nがないと、純粋なテキスト文字列を行と呼ぶことはできません。

しかし、私にとっては、ファイル内のテキスト文字列の行数を数えるのがより自然です。それを行う簡単な方法はありますか?

root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#
4
Just a learner

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
7

これにはawkを使用できます。これには、ファイルの先頭から現在のレコードの数を追跡する特別な変数NRがあります。変数は各行の終わりで増分されます。 ENDブロックで出力されると、つまりすべての入力行が処理された後、最後に処理されたレコードの番号が出力されます。

printf "aa\nbb" | awk 'END { print NR }'
2

printf "aa\nbb\n" | awk 'END { print NR }'
2
4
Inian