2017-09-23 47 views
0

列データに印刷できない改行文字をすべて削除します。二重引用符で囲まれた列の改行と改行を取り除くことができません

すべての列を二重引用符で囲んで、列にある新しい行の文字を簡単に削除し、行末の後にレコードの区切り文字を無視するようにしました。

私は、カンマで区切られた4つの列があり、テキストファイルに引用符で囲まれています。 は、私はそれが二重引用符

現在使用されているトリムの間に存在している場合にのみ、\ nと\ rの文字を削除しようとしているが、それはすべての改行を削除し、任意のレコードの区切り文字なしでそれをシーケンスファイルを作りました。

tr -d '\n\r' <in.txt> out.txt 

サンプルデータ:

"1"、 "試験する\ n

試料"、 "データ"、 "COL4" \ n

「2 \ nは

"、"テスト "、"サンプル "、"データ "\ n

"3"、 "サム\ nは

PLE"、 "テ\ nは

ST"、 "データ" \ nは

予想される出力:

」 1 "、" testSample "、" data "、" col4 "\ n

" 2 "、" Test "、" Sample "、" data "\ n

"3"、 "サンプル"、 "テスト"、 "データ" \ n

お勧めはありますか? GNUで事前に感謝

+1

コード/データの前に4つの空白を付けます。 [edit-help](http://stackoverflow.com/editing-help)を見てください。 – Cyrus

+1

その問題の説明は理にかなっていません。あなたの "期待される出力"が '' 3 ''と' 'Sample" 'の間にコンマを追加するのはなぜですか?それらの '\ n'物は何ですか?あなたのデータにリテラルのバックスラッシュはありますか? – melpomene

+0

こんにちは、カンマは間違いです。無視してください。 '\ n'は行の終わりを言うだけで、すべての列の末尾にある\ n文字を削除してはいけません。 –

答えて

0

が囲む"せずに改行交換のthis postを参照してください

sed ':a;N;$!ba;s/\("[^\n\r]*\)[\n\r\]*\([^\n\r]*\"\)/\1\2/g' file 

をsedの。

0

awkソリューションを試してみてください。これが役立つかどうか教えてください。

awk '{gsub(/\r/,"");printf("%s%s",$0,$0~/,$/?"":RS)}' Input_file 

出力は以下の通りです。

"1","test","Sample","data"\n 
"2","Test" \n 
"3","Sample" 

説明:行を印刷するprintfを使用し、その場合第二一つチェックし、最初の%sは、単に現在の行を印刷し、ここで(それはprintf印刷文字列に使用される)、2%のSを使用して行がカンマ(、)で終わっている場合は、新しい行を印刷するために何も印刷しません。キャリッジリターンを取り除きたい場合や、あなたが示す期待どおりの出力を得たい場合は、printfの前にgsub(/\r/,"")を追加してください。

編集:あなたの投稿タイトルは、キャリッジリターンを削除することを示唆しているので、キャリッジリターンを削除したい場合は、次に従うことができます。あなたはあなたの問題をはっきりと言及するべきです。

tr -d '\r' <Input_file> temp_file && mv temp_file Input_file 

上記は、入力ファイルからキャリッジ文字を削除し、同じInput_fileにも保存します。ここで

+0

あなたは正しいですが、二重引用符で囲んだ場合に限ります。 私の編集した質問を今すぐ確認してください:) –

+0

awkのソリューションにgsubを追加してみてください(キャリッジリターンを維持したい場合を除き、別のオプションについて考える必要がある場合を除き、私がコメントで言及し、私に知らせてください、それは同じことにあなたを助けるはずです。それがどうなるか教えてください。 – RavinderSingh13

0

が可能なソリューションです:

perl -pe 'if (tr/"// % 2) { chomp; $_ .= <>; redo; }' 

現在の行がアンバランス引用符(すなわち"の奇数)がある場合、それはフィールドの真ん中に終了しなければならないので、私たちは、改行をムシャムシャ食べる、追加します次の入力行に移動し、ループを再開します。

関連する問題