数値列と文字列列を含むカンマ区切りのファイルがあります。文字列列は引用符で囲まれており、引用符の間にカンマがある場合があります。列を識別する方法はFS =","
?
サンプル記録
"prabhat,kumar",19,2000,"bangalore,India"
存在するAWKしなければならない
$1 = "prabhat,kumar"
$2 = 19
$3 = "2000"
$4 = "bangalore,india"
設定FS=","
によって問題が発生します。
入力は次のとおりです
"prabhat,kumar",19,2000,"bangalore,India","ABC,DEF","GHI",123,"KLM","NOP,QRS"
"prabhat,kumar",19,2000,"bangalore,India","ABC,DEF","GHI",123,"KLM","NOP,QRS"
出力は次のようになります。
"prabhat,kumar"|19|2000|"bangalore,India"|"ABC,DEF"|"GHI"|123|"KLM"|"NOP,QRS"
"prabhat,kumar"|19|2000|"bangalore,India"|"ABC,DEF"|"GHI"|123|"KLM"|"NOP,QRS"
私が試しているコード:
awk -F"," '{for(i=1;i<=NF;i++){if(i%NF==0){ORS="\n"} {if($i ~ /^\"/ || $i ~ /\"$/) {a=a OFS $i;j++;{if(j%2==0){sub(/^\,/,X,a); print a;j=0;a=""}}} else {print $i}}} {ORS="|"}}' ORS="|" OFS=, p.txt
ベストアンサー1
まず、適切なCSVパーサーを使用する必要があります。たとえば、Perlでは次のものを使用できますText::CSV
。
インストール
cpanm
(Perlを使用している場合は後で感謝します)$ sudo apt-get install cpanminus
Debian ベースのシステムを使用していない場合は、ディストリビューションのパッケージマネージャを使用してインストールできます。
Text::CSV
モジュールの取り付け$ sudo cpanm Text::CSV
ファイルの解析
$ perl -MText::CSV -le ' $csv = Text::CSV->new({binary=>1}); while ($row = $csv->getline(STDIN)){ print "1:$row->[0], 2:$row->[1], 3:$row->[2], 4:$row->[3]"}' < file.csv 1:prabhat,kumar, 2:19, 3:2000, 4:bangalore,India
上からわかるように、最初のフィールドは
$row->[0]
、2番目のフィールド$row->[1]
などです。
これが正しい方法です。より簡単ですが汚れた方法は、引用符で囲まれたコンマを別の文字に置き換えることです。その後、通常どおり使用awk
し、最後にコンマに戻ります。ここではこれを使用していますが、###
フィールドの1つには決して現れないと確信しているすべてを使用できます。
$ sed -r 's/("[^",]+),([^",]+")/\1###\2/g' file.csv |
awk -F, '{print $1,$3}' | sed 's/###/,/g'
"prabhat,kumar" 2000