【问题标题】:Map fileds in multiple csv files and combine the rows映射多个 csv 文件中的字段并组合行
【发布时间】:2018-03-27 10:35:15
【问题描述】:

我的第一个 csv 文件中的数据是:

ID, name, city
1, John, NYC
2
3
4, Sam, SFO
5 

在第二个 csv 文件中

ID, name, city
3, Tim, STL
2, Daniel, BOS

第三个 csv 文件

ID, name, city
5, Eric, AST

我想要一个包含汇总数据的 csv 文件:

ID, name, city
1, John, NYC
2, Daniel, BOS
3, Tim, STL
4, Sam, SFO
5, Eric, AST 

我正在尝试使用 awk 执行此操作,但我是初学者,所以我无法找到执行此操作的方法。任何指针都会有所帮助。

【问题讨论】:

  • 你必须使用awk吗?为什么不使用 join 命令?

标签: csv awk


【解决方案1】:

假设 CSV 中的数据与您在上面共享的数据相同。

cat f1.csv f2.csv f3.csv|awk -F',' '$2!="" && $3!=""'

【讨论】:

    【解决方案2】:

    请尝试在单个 awk 中关注,如果这对您有帮助,请告诉我。

    awk -F, 'NR==1{print;next}FNR>1{a[$1]=NF>1 && a[$1]?a[$1] FS $0:(NF>1?$0:"")} END{for(i in a){if(a[i]){print a[i] | "sort"}}}' 1.csv 2.csv 3.csv
    

    输出如下。

    ID, name, city
     1, John, NYC
     2, Daniel, BOS
     3, Tim, STL
     4, Sam, SFO
     5, Eric, AST
    

    它也应该适用于超过 3 个文件,只有当它超过打开文件的限制时,为了避免任何 too many files opened 错误,我们必须运行以下代码。

    awk -F, '
    NR==1{
      print;
      next
    }
    FNR==1{
      if(val){
        close(val)
    };
      val=FILENAME
    }
    FNR>1{
      a[$1]=NF>1 && a[$1]?a[$1] FS $0:(NF>1?$0:"")
    }
    END{
      for(i in a){
        if(a[i]){
         print a[i] | "sort"
    }}
    }
    ' 1.csv 2.csv 3.csv
    

    【讨论】:

    • 不需要if(val){ close(val) } val=FILENAMEtoo many files opened error不会来这里,awk一个一个读取文件,同时关闭文件处理程序。
    • 不知道是谁给了我反对票,也没有告诉我理由,这让一个人灰心:(
    【解决方案3】:
    $ cat f1
    ID, name, city
    1, John, NYC
    2
    3
    4, Sam, SFO
    5 
    
    $ cat f2
    ID, name, city
    3, Tim, STL
    2, Daniel, BOS
    
    $ cat f3
    ID, name, city
    5, Eric, AST
    
    $ awk -F, 'FNR==1{i++}i<3{a[$1+0]=$0;next}i==3 && $1+0 in a{print a[$1+0];next}1' f2 f3 f1
    ID, name, city
    1, John, NYC
    2, Daniel, BOS
    3, Tim, STL
    4, Sam, SFO
    5, Eric, AST
    

    【讨论】:

      【解决方案4】:

      在输出中我们抑制无名记录和标题,然后按 ID 排序:

      $ (head -1 1st.csv
         awk -F, 'NF > 2 && FNR > 1' {1st,2nd,3rd}.csv | sort -n ) | tee combined.csv
      

      【讨论】:

        猜你喜欢
        • 2011-03-22
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 1970-01-01
        • 2013-07-19
        • 2014-08-19
        相关资源
        最近更新 更多