次のように、空行がたくさん含まれている.csvファイル(Macの場合)があります。
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum
lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum
lorem ipsum ","2","3","4"
私はそれを次のように変換したいと思います:
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4"
"1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4"
ライナーがあるはずですが、awkやsedについてはわかりません。どんなアドバイスもありがとうございました!
答え1
grepの(逆一致)パターンを使用して-v
これを行うことができます。
grep -v '^$' old-file.csv > new-file.csv
シェルのリダイレクトが機能するため、これらのファイルは異なるファイルでなければなりません。入力ファイルを読み込む前に、出力ファイルが開いて空になります。 moreutils(Mac OS Xではデフォルトではない)がある場合は、sponge
次の方法を使用してこの問題を解決できます。
grep -v '^$' file.csv | sponge file.csv
しかし、もちろん何かが間違っていると元に戻すのは難しいです。
「空行」に実際に空白を含めることができる場合(そのように聞こえますが)、次のものを使用できます。
egrep -v '^[[:space:]]*$' old-file.csv > new-file.csv
これにより、空白行だけでなく空白のみを含む行も無視されます。もちろんsponge
同じ方法で変換することもできます。
答え2
最も簡単なオプションはですgrep .
。ここで、ドットは「何でも一致」を意味するので、行が空の場合は一致しません。それ以外の場合は、行全体をそのまま印刷します。
答え3
空行を削除するには、所定の位置に、ksh93の使用:
sed '/./!d' file 1<>; file
リダイレクト演算子はksh93に固有であり、コマンドが終了した後にkshがファイルを切り捨てる点を除いて、<>;
標準演算子と同じです。<>
sed '/./!d'
作成する方法は複雑ですgrep .
が、残念ながらGNU grepは、標準出力が標準入力と同じファイルを指す場合、少なくとも文句を言うでしょう。次のように書くことができると言えます。
grep . file | cat 1<>; file
しかし残念ながら、ksh93(少なくとも私のバージョン(93u +))には、この場合、ファイルの長さがゼロに切り捨てられるように見えるバグがあります。
grep . file | { cat; } 1<>; file
エラーを解決したようですが、今はsedコマンドよりはるかに複雑になりました。
答え4
あなたの質問に対するコメントの説明に基づいて、例えば、次のようになります。
awk -v RS= -v ORS= 1
あなたが望むことをすることもできます。
空記録区切り記号awk
レコードが段落(一連の空行で区切られている)であることを示す特別なケースです。設定出力レコード区切り記号空の文字列は、これらの段落の内容(区切り文字なし)がリンクされていることを意味します。1
たった一つだけ本物各履歴の条件を印刷します。
ただし、これにより末尾の改行文字が省略されるため、次のようにできます。
awk -v RS= -v ORS= '1;END{if (NR) printf "\n"}'