根据标题行列的条件保留csv文件的列

根据标题行列的条件保留csv文件的列

我希望根据标题行的结构仅保留 CSV 文件的某些列。

数据说明:

  1. 在标题行(国家/地区字段)中,有几个字段为空。 
  2. 每个国家/地区的列数各不相同。每个国家/地区可以有 3 列或 10 列。
  3. 标题行中的列数(从字段不为空的位置开始)是动态的。它可以有 2 列或 100 列。

目标是如果国家存在于第一线,则保持每个国家的第一场。请问我怎样才能做到这一点awk?例子是这样的:

  • 输入:文件.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
    

谢谢四位的帮助。

答案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

相关内容