我想将文件 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
设置连接字段。