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

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

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

30
задан dggoldst
24.03.2023 18:08 Количество просмотров материала 3422
Распечатать страницу

3 ответа

в оболочке 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 для соединения означает соединение по вторым столбцам. В качестве альтернативы вступить -1 х -2 г файл1 файл2 вступит в столбце х file1 и колонны yth от файл2.

18
отвечен dggoldst 2023-03-26 01:56

Zsh ответ:

join =(sort abc) =(sort bcd)
3
отвечен Aaron F. 2023-03-26 04:13

это будет работать в оболочке 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

потому что join может считывать стандартный ввод с помощью' -'.

1
отвечен jianpx 2023-03-26 06:30

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх