Bash脚本通过相似的字段将两个csv文件连接起来并输出到第三个字段

时间:2019-03-02 23:50:42

标签: linux bash csv join merge

我有2个csv文件。带有以下字段名称的file1.csv和file2.csv

file1.csv: user_id,电子邮件

file2.csv: user_id,first_name,second_name

我创建了一个bash脚本来合并两个csv文件:

#!/bin/bash

#Script to merge two csv files based on user_id


join --header -t, <(sort -t, -k1 file_a.csv) <(sort -t, -k1 file_b.csv) > file3.csv

唯一的问题是,输出将列名user_id,email,first_name,last_name从底部开始放在与数据混合的3行中。任何人都有一个想法,我应该如何纠正这个问题才能使字段名称重新回到顶部?

2 个答案:

答案 0 :(得分:0)

您的排序正在将标头与数据混淆,很遗憾,排序没有 ignore header 选项。 awk来了!

首先定义一个函数

$ function sorth() { awk 'NR==1; NR>1{print | "sort"}' "$1"; }

现在可以

$ join --header -t, <(sorth file1) <(sorth file2)

N.B。我认为使用-k1进行排序不会在此处添加任何值,但是在您的区域设置中可能有所不同。如果是这样,请在awk脚本中添加选项。

答案 1 :(得分:0)

您可以简单地写:

join --header -t, <(
    { read;echo $REPLY;sort -t, -k1;}<file_a.csv
  ) <(
    { read;echo $REPLY;sort -t, -k1;}<file_b.csv
  ) > outputfile.csv

或者您可以创建一个函数:

hsort() {
    {
        read
        echo $REPLY
        sort -t, -k1
    } < "$1"
}

然后

join --header -t, <(hsort file_a.csv) <(hsort file_b.csv) >outputfile.csv