7

У меня есть два файла в среде 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

Но есть ли способ сделать это без создания временных файлов?

3 ответа3

18

В оболочке bash будет работать следующее:

# 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

Аргумент -k2 для сортировки означает сортировку по второму столбцу. Аргумент -j2 для присоединения означает присоединение ко вторым столбцам. В качестве альтернативы join -1 x -2 y file1 file2 присоединится к x-му столбцу file1 и y-му столбцу file2.

3

Зш ответ:

join =(sort abc) =(sort bcd)
1

Это будет работать в оболочке bash:

# 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

Потому что объединение может читать стандартный ввод, используя '-'.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .