我有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行中。任何人都有一个想法,我应该如何纠正这个问题才能使字段名称重新回到顶部?
答案 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