bash - 使用键值连接两个 csv 文件

标签 bash csv awk

我有两个 csv 文件,我想使用键值(城市列)连接它们。

一个csv文件,d01.csv有这样的形式,

Barcelona, 19.5, 29.5
Tarragona, 20.4, 31.5 
Girona, 17.2, 32.5
Lleida, 16.5, 33.5 
Vic, 17.5, 31.4

另一个 d02.csv 具有下一个结构,

City, Data, TMax, TMin
Barcelona, 20140916, 19.9, 28.5
Tarragona, 20140916, 21.4, 30.5  
Lleida, 20140916, 17.5, 32.5 
Tortosa, 20140916, 20.5, 30.4

我需要一个新的 csv 文件,其中有一列城市出现在 2 个 csv 文件中。

City, Tmin, Tmax, Date, Tmin1, Tmax1
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5
Tarragona, 20.4, 31.5, 20140916, 21.4, 30.5
Girona, 17.2, 32.5, 20140916, 17.5, 32.5
Lleida, 16.5, 33.5, 20140916, 20.5, 30.4

我试着用

join -j 2 -t ',' d01.csv d02.csv | awk -F "," '{print $1, $2, $3, $4, $5} > d03.csv

但还不完整...我如何订购键值?

最佳答案

以下是在 bash 中使用 join 的方法:

{
  echo "City, Tmin, Tmax, Date, Tmin1, Tmax1"
  join -t, <(sort d01.csv) <(sed 1d d02.csv | sort)
} > d03.csv
cat d03.csv
City, Tmin, Tmax, Date, Tmin1, Tmax1
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5  

请注意,join 仅输出键在两个文件中都存在的记录。要获取所有这些,请指定您想要两个文件中缺少的记录,指定您想要的字段,并为缺少的字段提供默认值:

join -t, -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4 -e '?' <(sort d01.csv) <(sed 1d d02.csv | sort)
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5
Girona, 17.2, 32.5,?,?,?
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5  
Tortosa,?,?, 20140916, 20.5, 30.4
Vic, 17.5, 31.4,?,?,?

关于bash - 使用键值连接两个 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25875368/

相关文章:

xml - 从 unix 命令行进行基本 xml 解析的最简单方法

php - 主管 : How do I execute custom php command if any of worker e. g。进程 ID 123 停止

linux - 无论空闲时间如何自动注销linux

bash - 移动 "n"文件,每个文件在 ubuntu 中使用命令行或 bash 移动到特定文件夹

linux - 对大型 .txt 或 .csv Linux 的列求和

java - 从 CSV 文件读取速度慢

R 从 write,csv 中删除第一行

command-line - 通用 awk 脚本通过命令行参数计算任何字段的平均值

awk - 用于 UTF-16 二进制文件的 grep 和 tail -f - 尝试使用简单的 awk

bash - 如何在没有交互的情况下安装 Certbot (Let's Encrypt)?