使用键值连接两个csv文件

Enr*_*que 12 csv bash 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
Run Code Online (Sandbox Code Playgroud)

另一个,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
Run Code Online (Sandbox Code Playgroud)

我需要一个新的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
Run Code Online (Sandbox Code Playgroud)

我试着这样做

join -j 2 -t ',' d01.csv d02.csv | awk -F "," '{print $1, $2, $3, $4, $5} > d03.csv
Run Code Online (Sandbox Code Playgroud)

但它不完整......我怎样才能订购关键值?

gle*_*man 11

以下是如何在bash中使用join:

{
  echo "City, Tmin, Tmax, Date, Tmin1, Tmax1"
  join -t, <(sort d01.csv) <(sed 1d d02.csv | sort)
} > d03.csv
cat d03.csv
Run Code Online (Sandbox Code Playgroud)
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  
Run Code Online (Sandbox Code Playgroud)

请注意,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)
Run Code Online (Sandbox Code Playgroud)
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,?,?,?
Run Code Online (Sandbox Code Playgroud)