ヘッダー行と列の条件に基づいてcsvファイルの列を保持します。

ヘッダー行と列の条件に基づいてcsvファイルの列を保持します。

ヘッダー行の構造に基づいてCSVファイルの特定の列だけを維持したいと思います。

データは以下を示しています。

  1. ヘッダー行(国フィールド)から複数のフィールドが空です。。 
  2. 列数は国によって異なります。各国には3つの列または10の列があります。
  3. ヘッダー行の列数(フィールドが空でないところから始まる)は動的です。 2つの列または100の列を持つことができます。

国が最前線に存在する場合は、各国の最初のフィールドを維持することが目標です。どうすれば達成できますかawk?例は次のとおりです。

  • 入力:file.csv
    ,,,fr,fr,fr,ch,ch,ch
    num,nom,date reg,match flag,date1,date2,match flag,date1,date2
    0001,AA,2020-05-15,reg1,2019-02-03,2019-02-05,reg2,2019-05-06,2019-06-10
    0002,AAA,2020-05-20,,,,reg3,2020-05-06,2020-06-10
    
  • 希望の出力:file1.csv
    ,,,fr,ch
    num,nom,date reg,match flag_fr,match flag_ch
    0001,AA,2020-05-15,reg1_fr,reg2_ch
    0002,AAA,2020-05-20,,reg3_ch
    

助けてくれた4人全員に感謝します。

答え1

最初のレコードのフィールドを繰り返し、条件付きでそのインデックスをリストに追加してから、各レコードのフィールドを繰り返し、そのリストにインデックスを持つフィールドを印刷する必要があります。

前任者。

$ awk -F, '
  BEGIN {OFS=FS}
  NR==1 {
    for(i=1;i<=NF;i++) if($i=="" || !seen[$i]++){inds[i]=1; lasti = i}
  }
  {
    for(i=1;i<=NF;i++) if(inds[i]) printf "%s%s", $i, i==lasti ? ORS : OFS
  }
' file.csv
,,,fr,ch
num,nom,date reg,match flag,match flag
0001,AA,2020-05-15,reg1,reg2
0002,AAA,2020-05-20,,reg3

関連情報