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
処理することがわかります。\r
0x0d
基本タイプビルダーの「キャリッジリターン」文字を作成します。現在のカーソル位置を再インポートし、「行の開始」に次の位置を書き込む準備ができました。
修正する
ここで正しいsed
コマンドを確認してください。
Excelファイルの「\r」を修正
記録のため
このマイクロソフトのバグは勝者です。 Windows、Unix(すべて)、MacOS Xなどのオペレーティングシステムでは、Excel行末のエンコードが正しくありません。
あなたはそれを打つことはできません:)。
答え4
正しいアプローチは次のとおりです。
head -10 file.txt
(最初の10行を印刷してください)
別の方法は次のとおりです。
cat file.txt | head -10