csv列の最初の2行を列ごとにマージする方法は?

csv列の最初の2行を列ごとにマージする方法は?

csvに変換されたExcelファイルがあります。変換後は以下の例のようになります(csvには100を超える列があります。これは縮小版です)。

,Product,"  ",Citty,"   ",Price
,Name," ",Location,"    ",Per Unit
,banana,"   ",CA,"  ",5.7
,apple,"    ",FL,"  ",2.3

1行目と2行目を取得し、コンマの配置に従って「マージ」するスクリプトを作成する必要があります。

,Product Name," ""  ",Citty Location,"  ""  ",Price Per Unit
,banana,"   ",CA,"  ",5.7
,apple,"    ",FL,"  ",2.3

こことStack Overflowで他の質問を見ましたが、答えはファイルの最初の2行の奇妙な列別の状況とは関係がないようです。


無関係な追加操作でcsvから空の列を削除し、タイプミスを修正して次のように見せたいと思います。

Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3

(csvには現在、各実際のデータ列の間に引用符で囲まれたタブがあります。ただし、最初の列は空で、後ろにカンマがあります。)

何度もタイプミスのあるCSVを受け取るので、スクリプトのエラーをプログラムで修正したいと思います。また、列は常に上記の順序で表示されない可能性があるため、スクリプト中に各列名にエラーがないことを動的に確認する必要があります。

ベストアンサー1

この試み

$ awk -F, 'NR<2{split(gensub(/Citty/,"City","g",$0),a,FS)}NR==2{for(b=2;b<=NF;b+=2){c=c a[b]" "$b","}print gensub(/,$/,"",1,c)}NR>2{print gensub(/(^,|" *",)/,"","g",$0)}' inp
Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3
$

同じコードを複数行に分割すると、読みやすくなります。

$ awk -F, '
> NR<2{split(gensub(/Citty/,"City","g",$0),a,FS)}
> NR==2{for(b=2;b<=NF;b+=2){c=c a[b]" "$b","}print gensub(/,$/,"",1,c)}
> NR>2{print gensub(/(^,|" *",)/,"","g",$0)}' inp
Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3
$

最初の行の場合は、行をa内の配列要素に分割します。都市 - >都市スペルエラーを修正しました。

2行目の場合は、2列目から始めて、その列と一緒に1行目の対応する列を印刷します。各列に対してこの操作を2列ずつ繰り返します。末尾のエントリを削除します,

2行目以降は、,前の項目またはすべての項目を"<spaces>",空の文字列に置き換えて結果を印刷します。

GNU Awk 4.0.2でよくテストされました。

オンラインでお試しください!

おすすめ記事