「head」は1行だけ印刷しますか?

「head」は1行だけ印刷しますか?

ExcelでCSVとして保存して作成されたCSVファイルがあります。 「head」(または実際には「grep」など)を実行すると、最初の行だけが印刷されます。

head -n 10 messy.csv
10,15,11,21

ただし、テキストエディタまたはExcelでファイルを開くと、次のような行がたくさん含まれています。

10,15,11,21
9,11,17,19
7,11,24,18
... 

headコンピュータの他のファイルでうまく動作します。

なぜこれですか? (これは行末と関係があると思いますが、何がわかりません。)どのように修正しますか?

答え1

私はこれが行末に関連していると思います。 Excelはキャリッジリターン/改行の末尾にファイルを保存しますが、head改行のみが必要です。

表示される出力は次のとおりです。 tr -d '\r' < messy.csv | head -10

10行が正しく表示されたら、それは正解です。

file一部のテキストファイルの行末を知らせることができます(印刷されます)。...、CRLF行終端を含む)、しかし、すべてのテキストファイルに対してこれを行うわけではありません(そのファイルをHTMLなどの他のものとして認識している場合は、これをしないと思います)。

答え2

あなたは\r ただ2行目から行末文字として使用されます(少なくとも10行目まで)。ライン 1\nにはライン終端があります。例えば。

printf 'ABC\nXYZ\r123\r' | head

出力(画面に)

ABC

これは展示する端末出力に関連するアーティファクト。行の先頭に戻る\rと、次の行が上書きされ、最後の行は端末プロンプトによって完全または部分的に上書きされます。

最後\rに区切られた行がプロンプトより長い場合、その行は次のようになります。部分的に表示(プロンプト終了後) - たとえば、以下のサンプル出力では、ターミナルプロンプトはnn $5文字nnです。ここでn番目のコマンドが実行されます。

72 $ printf 'ABC\nXYZ\rabcdefghijklmnop\r' 
ABC
73 $ fghijklmnop

この問題を解決するために

sed -i.bak 's/\r$//; s/\r/\n/g' file

この-i.bakオプションを使用すると、入力がfile更新されます。nlineでバックアップを作成しますfile.bak。バックアップしたくない場合は、単に使用してください-i

答え3

問題を分析する

head動作が予想したものとは異なります。簡単な分析ツールに切り替えて、 od何が起こっているのかを確認してください。

od -cx messy.csv

次に、headこのファイルで何をすべきかを調べてください。

head -2 messy.csv | od -cx

次のように設計されているため、戻りASCIIコード()をhead処理することがわかります。\r0x0d

基本タイプビルダーの「キャリッジリターン」文字を作成します。現在のカーソル位置を再インポートし、「行の開始」に次の位置を書き込む準備ができました。

修正する

ここで正しいsedコマンドを確認してください。 Excelファイルの「\r」を修正

記録のため

このマイクロソフトのバグは勝者です。 Windows、Unix(すべて)、MacOS Xなどのオペレーティングシステムでは、Excel行末のエンコードが正しくありません。

あなたはそれを打つことはできません:)。

答え4

正しいアプローチは次のとおりです。

head -10 file.txt(最初の10行を印刷してください)

別の方法は次のとおりです。

cat file.txt | head -10

関連情報