2017-09-26 24 views
0

csvの書式を混在させた4GBのtxtファイルを操作しようとしています。データには区切り文字 '"'で定義されている約38個の '列'があります(例を次に示します)。データはフィールド区切り記号としてカンマを使用してエクスポートされましたが、データとのインラインでほとんどのプラットフォームにインポートできません。私はawk/sed/catを使ってデータを修正できると信じています。データの各列は引用符を使って定義することができます。すべてのコンマがピリオドなどで置き換えられた2組の引用符内にあるものコンマを含むセクションは、列の中央にあり、データセット内の最後のフィールドではありません。カンマでawkを使って、sedを使って置き換えてからcatを使ってファイルに貼り付けてください。awkを使用して区切り文字を可変テキストで区切って区切り文字を区切ります。

実際のデータは機密データであり、共有することはできませんが、以下の例は類似しています。

データサンプル:

"identifier","Status","Name","City","Application","Job","Details","column 39" 
"red","paid","Dave","Philadelphia","55823","Cashier","No commas in this comment","spare1" 
"rojo","past due","Steve","San Francisco","78434","trainer","Does not like sushi, beer, or ham","spare2" 
"verde","pending","Duncan","Columbus","65478","CEO","Late for work, on the fifth","spare3" 

所望の結果はコンマを変更するに焦点を当て、および「コラム39」の後に、インラインまたは終わりにデータを追加して

"identifier","Status","Name","City","Application","Job","Details","column 39" 
"red","paid","Dave","Philadelphia","55823","Cashier","No commas in this comment","spare1" 
"rojo","past due","Steve","San Francisco","78434","trainer","Does not like sushi. beer. or ham","spare2" 
"verde","pending","Duncan","Columbus","65478","CEO","Late for work. on the fifth","spare3" 

任意の提案は大歓迎です!

+0

Pl簡単に、期待される出力と厄介なデータの2行を投稿してください。私たちはテストケースを自分たちで作るのは好きではありません。 –

+0

@JamesBrownはコンテンツが不足していることを謝り、数行の例を追加しました。 –

答えて

0

あなたは

$ f1=$'"column 1","Column 2","Name","Address","Application","Job","Comments, about, items that also have, commas, inline","column 39"' 

$ echo "$f1" |sed -r 's/([^"]),([^"])/\1\2/g' 
"column 1","Column 2","Name","Address","Application","Job","Comments about items that also have commas inline","column 39" 

それとも、何か他のもので、内カンマを置き換えることができますし、後で戻って、内側カンマに戻すことができるように、内側コンマを削除するsedを使用することができ、次のいずれか

$ f2=$(echo "$f1" |sed -r 's/([^"]),([^"])/\1-x2c-\2/g');echo "$f2"  "column 1","Column 2","Name","Address","Application","Job","Comments-x2c- about-x2c- items that also have-x2c- commas-x2c- inline","column 39" 
#or use sed -r 's/([^"]),([^"])/\1.\2/g' to replace inner commas with dots 

$ echo "$f2" |sed 's/-x2c-/,/g' 
"column 1","Column 2","Name","Address","Application","Job","Comments, about, items that also have, commas, inline","column 39" 

それとも、カンマだけでなく、","に基づいてフィールドの解析にawkの種類を使用できます。

$ echo "$f1" |awk -vFPAT='[^,]*|"[^"]*"' '{print $1}' 
"column 1" 

$ echo "$f1" |awk -vFPAT='[^,]*|"[^"]*"' '{print $7}' 
"Comments, about, items that also have, commas, inline" 

$ echo "$f1" |awk -vFPAT='[^,]*|"[^"]*"' -vOFS="," '{print $1,$7}' 
"column 1","Comments, about, items that also have, commas, inline" 
+0

Georgeさん、ありがとう、2番目のインスタンスは完全に機能し、私はそれを理解することができました。実行するにはLinuxに切り替える必要がありました。私がOSXで起動していたと言いました。 –

関連する問題