Como juntar arquivos na linha de comando sem criar arquivos temporários?

7

Eu tenho dois arquivos em um ambiente Linux / Bash:

# Example data
$ cat abc
2       a
1       b
3       c

$ cat bcd
5       c
2       b
1       d

Eu estou tentando juntar os dois arquivos na primeira coluna. O seguinte não funciona porque os arquivos de entrada devem ser classificados no campo de correspondência.

# Wrong: join on unsorted input does not work
$ join abc bcd

Eu posso contornar isso criando dois arquivos temporários e juntando-os

$ sort abc > temp1
$ sort bcd > temp2
$ join temp1 temp2
1 b d
2 a b

Mas existe uma maneira de fazer isso sem criar arquivos temporários?

dggoldst
fonte

Respostas:

18

O seguinte irá funcionar no shell bash:

# Join two files
$ join <(sort abc) <(sort bcd)
1 b d
2 a b

Você pode participar em qualquer coluna desde que você classifique os arquivos de entrada nessa coluna

# Join on the second field
$ join -j2 <(sort -k2 abc) <(sort -k2 bcd)
b 1 2
c 3 5

O argumento -k2 para classificar significa ordenar na segunda coluna. O argumento -j2 para juntar significa juntar-se às segundas colunas. Alternativamente, junte -1 x -2 y file1 file2 irá juntar-se na xth coluna do arquivo1 e na yth coluna do arquivo2.

dggoldst
fonte
3

Resposta Zsh:

join =(sort abc) =(sort bcd)
Aaron F.
fonte
1

Isso funcionará no shell bash:

# Join two files
$ sort abc | join - <(sort bcd)
1 b d
2 a b

OU

# Join two files
$ sort bcd | join <(sort abc) -
1 b d
2 a b

Porque join pode ler entrada padrão usando '-'.

jianpx
fonte