2016-10-06 5 views
-2

file1.csvUnixが異なるヘッダ

で2つのCSVファイルをマージ
header1, header2, header3, header4, header5 
a, b, c, d, e 
+0

あなたはこれを解決しようとするいかなる試みを行いましたか? – Inian

+0

はい、等しくて枯渇した列では解決されましたが、列数が等しくない場合には解決できませんでした – Johnny

+2

質問の内容を更新してください。 – Inian

答えて

0

ここでは一般的なケースです:

データ見てすべてのヘッダを追跡します:

$ cat file1.csv 
header1, header2, header3, header4, header5 
a, b, c, d, e 

$ cat file2.csv 
header1, header3, header4, header5 
j, w, c, a 

$ cat file3.csv 
header1, header2, header3, header5, header6 
1, 2, 3, 4, 5 

file1がheader6
FILE2がHEADER2とheader6
FILE3が欠落している欠落して不足していますヘッダー4

コード:

awk -F ", " -v OFS="," ' 
    FNR == 1 { 
     delete this_file_headers 
     for (i=1; i<=NF; i++) { 
      this_file_headers[i] = $i 
      if (!($i in all_headers)) { 
       all_headers[$i] 
       all_headers_ordered[++nhead] = $i 
      } 
     } 
     next 
    } 
    { 
     lineno++ 
     for (i=1; i<=NF; i++) 
      data[lineno,this_file_headers[i]] = $i 
    } 
    END { 
     sep = "" 
     for (i=1; i<=nhead; i++) { 
      printf "%s%s", sep, all_headers_ordered[i] 
      sep=FS 
     } 
     print "" 

     for (i=1; i<=lineno; i++) { 
      sep = "" 
      for (j=1; j<=nhead; j++) { 
       printf "%s%s", sep, data[i,all_headers_ordered[j]] 
       sep=FS 
      } 
      print "" 
     } 
    } 
' file{1,2,3}.csv 

出力

header1, header2, header3, header4, header5, header6 
a, b, c, d, e, 
j, , w, c, a, 
1, 2, 3, , 4, 5 
+0

HEADER1、HEADER2、header3、header4、header5 、B、C、D、E HEADER1、HEADER2、header4 、B、 header6 X C君は、この例でのみ動作し、やりました とouput 'header1、header2、header3、header4、header5、header6 a、b、c、d、e、、、、 a、b、c、、、、 、、、、、x ' 正確ではなく、余分を与えて、 – Johnny

+0

はgawk/nawk/mawkでfedoraでこれを再現できません。あなたのプラフォームとawkバージョンは何ですか? –

+0

私はそれを再現することができますが、大きなファイルの場合、いくつかのヘッダーのマッチングは正しいですが、他のものはありません...あなたは何か手がかりを持っていますか? – Johnny

0
あなたが貼り付けコマンドを使用して試すことができます

paste -d'\n' file1.csv <(awk -F',' 'NR>1{print $1", ,"$2","$3","$4}' file2.csv) 

とawk;

awk 'NR==1{print $0}; NR==FNR{a[FNR]=$0;next} ; FNR > 1 {print a[FNR]"\n" $1" , "$2" "$3" "$4}' file1.csv file2.csv 

例:

[email protected]:/tmp/test$ awk 'NR==1{print $0}; NR==FNR{a[FNR]=$0;next} ; FNR > 1 {print a[FNR]"\n" $1" , "$2" "$3" "$4}' file1.csv file2.csv 
header1, header2, header3, header4, header5 
a, b, c, d, e 
j, , w, c, a 
+0

が動作しません:/ awk 'NR == 1 {print $ 0}; NR == FNR {a [FNR] = $ 0;次へ} FNR> 1「file1.csv file2.csv 'HEADER1、HEADER2、header3、header4、header5 {、 "$ 2" "$ 3"「$ 4 [FNR] "の\ n" $ 1" を印刷します} b、c、d、e j、w、c、a、 ' – Johnny

+0

@Johnny:私はansを更新しました。ペーストコマンドで試してみてください。 –

+0

この例では、ヘッダ2をスキップしてもスキップされた場合のみ、この例で動作します。 – Johnny

関連する問題