将两个文件中的匹配 id 与两个文件中的其他列连接起来

将两个文件中的匹配 id 与两个文件中的其他列连接起来

我想将文件 A 中的 ID 与文件 B 进行匹配,将其保存在第三个文件中,其中的列属于这两个文件。我已经尝试了几乎所有我发现的 awks,但不知何故无法正常工作。我将不胜感激你的帮助!

fileA

id;name
1;"sam"
4;"jon"

fileB

id;surname
5;"smith"
1;"khon"

file3

id;name;surname
1;"sam";"khon"

答案1

通常,这将是 的工作join。但是,join需要对输入进行排序,并且sort在我知道的所有语言环境中将数字放在字母之前(如果这不是真的,请纠正我)。所以join只能让你到达那里的一部分:

$ join -t';' <(sort fileA) <(sort fileB)
1;"sam";"khon"
id;name;surname

您可以通过先加入每个文件的第一行,然后加入其余部分来解决此问题:

$ join -t';' <(head -n1 fileA) <(head -n1 fileB)
id;name;surname
$ join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
1;"sam";"khon"

然后,将它们分组到子 shell 中并重定向输出即可获得所需的输出:

 $ ( join -t';' <(head -n1 fileA) <(head -n1 fileB); join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort))
id;name;surname
1;"sam";"khon"

所以你可以这样做:

( 
    join -t';' <(head -n1 fileA) <(head -n1 fileB); 
    join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
) > file3

或者,您确实可以这样做awk

$ awk -F';' '(NR==FNR){data[$1]=$1";"$2; next} 
             ($1 in data){print data[$1]";"$2}' fileA fileB 
id;name;surname
1;"sam";"khon"

答案2

使用米勒(https://github.com/johnkerl/miller)并运行

mlr --csv --fs ";" join -j id -f fileA.csv fileB.csv >file3.csv

你有

+----+------+---------+
| id | name | surname |
+----+------+---------+
| 1  | sam  | khon    |
+----+------+---------+

一些注意事项:

  • --fs设置字段分隔符;
  • -j设置连接字段。

相关内容