行末文字に関係なくファイルの行数を計算する

行末文字に関係なくファイルの行数を計算する

さまざまなファイルを受け取りましたが、その中には\r\nで終わる行があるとしましょう\r\n。何が起こるのか事前にわからない場合は、ファイルの行数をどのように効率的に計算できますか?

wc -l明らかに、これはMacラインエンドがある場合は動作しません。

Grepを使用すると、非常に不正確なようです。

grep -o '\r' /path/to/file.txt | wc -l

1041行が与えられ、実際には299行しかないが、nanoこれはMacフォーマットで自動変換を通じて確認できる。

grep -o '[\r\n]+' /path/to/file.txt | wc -lまた、戻り回数が0なので、私が期待した多様性を提供しません。

これを正しく行うにはどうすればよいですか?

ベストアンサー1

あなたのコマンドは、以下を使用してあまりにもgrep多くの一致を提供します。grep基本正規表現,特別な意味を持たない\r文字「r」の発生回数を計算します。

tr するすべての一致を検索し、バイト単位で計算する\n合計を識別します。\rwc -c

tr -d -c '\n\r' < file.txt | wc -c

ただし、ファイルにWindows / DOS行終端文字(\r\n)が含まれる可能性があるため、これらの行終端は2回カウントされます。 DOSスタイルの行末を他の形式の1つに変換してから、以前のように個々の行末を計算するには、追加の手順が必要です。

sed 's/\r$//' file.txt | tr -d -c '\n\r' | wc -c

sed残念ながら、どちらかを識別することは必ずしも可能ではありません\r。シェル自体のエスケープ、コマンド、echoまたは sed スクリプトをファイルに入れるなど、キャリッジリターンを指定する別の方法を使用する必要があります。

おすすめ記事