Заполнение пустого поля в Unix

У меня есть два файла, где я хочу выполнить операцию объединения на основе 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

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

Ответы

Ответ 1

"Важно: 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 ed заранее.

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

Ответ 2

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

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt