我在 Linux / Bash 环境中有两个文件:
# Example data
$ cat abc
2 a
1 b
3 c
$ cat bcd
5 c
2 b
1 d
我正在尝试在第一列上合并两个文件。以下方法不起作用,因为输入文件必须按匹配字段排序。
# Wrong: join on unsorted input does not work
$ join abc bcd
我可以通过创建两个临时文件并将它们合并来解决这个问题
$ sort abc > temp1
$ sort bcd > temp2
$ join temp1 temp2
1 b d
2 a b
但是有没有办法在不创建临时文件的情况下做到这一点?
答案1
以下命令将在 bash shell 中运行:
# Join two files
$ join <(sort abc) <(sort bcd)
1 b d
2 a b
只要你对该列上的输入文件进行排序,你就可以加入任何列
# Join on the second field
$ join -j2 <(sort -k2 abc) <(sort -k2 bcd)
b 1 2
c 3 5
sort 的 -k2 参数表示按第二列排序。join 的 -j2 参数表示按第二列连接。或者 join -1 x -2 y file1 file2 将按 file1 的第 x 列和 file2 的第 y 列连接。
答案2
Zsh 回答:
join =(sort abc) =(sort bcd)
答案3
这在 bash shell 中有效:
# Join two files
$ sort abc | join - <(sort bcd)
1 b d
2 a b
或者
# Join two files
$ sort bcd | join <(sort abc) -
1 b d
2 a b
因为join可以使用‘-’来读取标准输入。