如何在命令行上合并文件而不创建临时文件?

如何在命令行上合并文件而不创建临时文件?

我在 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可以使用‘-’来读取标准输入。

相关内容