さまざまなファイルを受け取りましたが、その中には\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
合計を識別します。\r
wc -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 スクリプトをファイルに入れるなど、キャリッジリターンを指定する別の方法を使用する必要があります。