【问题标题】:Merge two csv files in bash在bash中合并两个csv文件
【发布时间】:2017-09-06 11:34:49
【问题描述】:

我有两个 csv 文件。

第一个文件的列

col1, col2, col3,......col4095, col4096, col4097

第二个文件的列

col1, col2, col3,......,col4095, col4096, col4097

预期输出 - 第一个文件的最后一列被丢弃

col1, col2, col3.......,col4095. col4096, col1, col2, col3....col4095, col4096, col4097

两个文件的行数相同,我想将两个文件合并为一个文件。

【问题讨论】:

标签: bash


【解决方案1】:

使用paste

paste -d, f1.csv f2.csv > out.csv

忽略第一个文件的最后一列:

awk -F, 'NF-=1' OFS=, f1.csv | paste -d, - f2.csv > out.csv

【讨论】:

  • 我不需要第一个文件的最后一列 @sat
  • @cpwah,更新答案。
【解决方案2】:

只有awk:

awk -F ',[[:blank:]]*' 'NR==FNR {for (i=1;i<NF;i++) out=out$i", " ; next} \
                        {out=out$0} END{print out}' f1.csv f2.csv
  • -F ',[[:blank:]]*' 将字段分隔符设置为, 后跟任意数量的空格/制表符

  • NR==FNR 仅适用于第一个文件,然后将执行 {for (i=1;i&lt;NF;i++) out=out$i", " ; next},这将遍历并连接变量 out 中除最后一个以外的所有字段

  • 第二个文件的记录将连接到变量out -- {out=out$0}

  • 最后打印出变量out的值——END{print out}

示例:

% cat f1.csv                                                                                                        
col1, col2, col3,......col4095, col4096, col4097

% cat f2.csv 
col1, col2, col3,......,col4095, col4096, col4097

% awk -F ',[[:blank:]]*' 'NR==FNR {for (i=1;i<NF;i++) out=out$i", " ; next} {out=out$0} END{print out}' f1.csv f2.csv 
col1, col2, col3, ......col4095, col4096, col1, col2, col3,......,col4095, col4096, col4097

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2020-08-22
    • 2013-07-23
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2012-04-19
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多