![如何在命令行上合并文件而不创建临时文件?](https://linux22.com/image/1212802/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E5%90%88%E5%B9%B6%E6%96%87%E4%BB%B6%E8%80%8C%E4%B8%8D%E5%88%9B%E5%BB%BA%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我在 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可以使用‘-’来读取标准输入。