Заполнение пустого поля в Unix Join Operation - PullRequest
14 голосов
/ 12 июня 2009

У меня есть два файла, где я хочу выполнить операцию объединения на основании 1-го столбца:

file1.txt

foo 1
bar 2
qux 3

file2.txt

foo x
qux y
boo z

Результат, который я надеюсь получить, выглядит следующим образом:

foo  1 x
bar  2 -
qux  3 y
boo  - z

где заполнены пустые поля столбца 1 с "-".

Но почему эта команда соединения не работает так, как я ожидал?

$ join -a1 -a2 -e"-" file1.txt file2.txt

Какой правильный способ сделать это?

Ответы [ 2 ]

26 голосов
/ 12 июня 2009

"Важно: FILE1 и FILE2 должны быть отсортированы по полям соединения." (из этой онлайн-страницы).

Эта проблема №1. Проблема №2 хуже: опция -e плохо документирована - работает только в сочетании с -o, например:

$ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt
bar 2 -
boo - z
foo 1 x
qux 3 y

где префикс s указывает на файлы, которые я sort редактировал заранее.

Редактировать: man join объясняет переключатель -o (как и онлайн-справочную страницу, на которую я указал выше). Он определяет поля для вывода (1.2 означает 2-е поле из файла 1, & c) или 0 для обозначения поля соединения и представляет собой список через запятую. (На самом деле я не помню значение 0, поэтому изначально давал неуклюжее решение, требующее пост-обработки awk, но текущее решение лучше ... и не нужно awk!)

3 голосов
/ 14 марта 2017

-e работает только с -o

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...