在bash中加入两个csv文件

时间:2017-04-21 20:41:37

标签: bash join merge

我必须通过一列中的值join两个文件。我需要使用unix bash

我的第一个文件如下:

user_id, song_id, timestamp
00001638d6189236866af9bbf309ae6c2347ffdc,SOBBMDR12A8C13253B,1203083335
00001638d6189236866af9bbf309ae6c2347ffdc,SOBXALG12A8C13C108,984663773
00001cf0dce3fb22b0df0f3a1d9cd21e38385372,SODDNQT12A6D4F5F7E,1275071044
00001cf0dce3fb22b0df0f3a1d9cd21e38385372,SODDNQT12A6D4F5F7E,1097509573

第二档:

user_id, natural_key
00000b722001882066dff9d2da8a775658053ea0,6944471
00001638d6189236866af9bbf309ae6c2347ffdc,19309784
0000175652312d12576d9e6b84f600caa24c4715,10435505
00001cf0dce3fb22b0df0f3a1d9cd21e38385372,5232769

当然两个文件都有更多行。我希望通过第一列( user_id join这两个文件并获得此结果:

natural_key, song_id, timestamp
19309784,SOBBMDR12A8C13253B,1203083335
19309784,SOBXALG12A8C13C108,984663773
5232769,SODDNQT12A6D4F5F7E,1275071044
5232769,SODDNQT12A6D4F5F7E,1097509573

我尝试用joinawk做一些事但无济于事。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

使用GNU join,sed,sort和bash:

echo "natural_key, song_id, timestamp"
join -t, <(sed '1d' file1 |sort -t, -k1,1) <(sed '1d' file2 | sort -t, -k1,1) -o 2.2,1.2,1.3

输出:

natural_key, song_id, timestamp
19309784,SOBBMDR12A8C13253B,1203083335
19309784,SOBXALG12A8C13C108,984663773
5232769,SODDNQT12A6D4F5F7E,1097509573
5232769,SODDNQT12A6D4F5F7E,1275071044

答案 1 :(得分:1)

这个在GNU awk中(正则表达式FS)。您的示例中的标题间距我将忽略:

$ awk 'BEGIN{FS=", ?";OFS=","}NR==FNR{a[$1]=$2;next}$1 in a{print a[$1],$2,$3}' file2 file1
natural_key,song_id,timestamp
19309784,SOBBMDR12A8C13253B,1203083335
19309784,SOBXALG12A8C13C108,984663773
5232769,SODDNQT12A6D4F5F7E,1275071044
5232769,SODDNQT12A6D4F5F7E,1097509573

说明:

$ awk '
BEGIN   { FS=", ?"; OFS="," }    # set the delimiters
NR==FNR { a[$1]=$2; next }       # hash the first file in paramaters 
$1 in a { print a[$1], $2, $3 }  # if key is found in hash, output
' file2 file1                    # mind the order

答案 2 :(得分:0)

使用mlr util:

mlr --csvlite  join -j user_id -f f1.csv \
         then  cut -o -f ' natural_key',' song_id',' timestamp' f2.csv

输出:

 natural_key, song_id, timestamp
19309784,SOBBMDR12A8C13253B,1203083335
19309784,SOBXALG12A8C13C108,984663773
5232769,SODDNQT12A6D4F5F7E,1275071044
5232769,SODDNQT12A6D4F5F7E,1097509573

请注意标题中的前导空格。这些在这里完好无损,因为:

  1. 大多数源数据头都有前导空格,但数据没有。

  2. 如果不带引号,前导空格将会因大多数 CSV 导向的工具而失败。