Если в первом поле нет специальных символов, таких как .
или /
или [
или (
или \
или каких-либо специальных символов регулярных выражений, ваша идея на самом деле не так уж и плоха:
sed "$(cut -d' ' -f1 file1 | sed 's@.*@/&/{N;d}@')" file2
cut -d' ' -f1 file1
- извлечь первое поле из файла1 | sed
.*
- заменить что-либо. ie. первое поле из файла1 /&/{N;d}
- &
заменяет все, что мы заменяем. Итак, для первого поля. Таким образом, он становится /<first field>/{N;d}
- , затем оберните его вокруг
sed "<here>" file2
Не так много известной функции, вы можете использовать другой символ для /regex/
с синтаксис \<char>regex<char>
как \!regex!
. Ниже я использую ~
:
sed "$(cut -d' ' -f1 file1 | sed 's@.*@\\~&~{N;d}@')" file2
Если у вас, однако, есть какие-либо специальные символы в первом поле, тогда, если вам не нужна сортировка: вы можете заменить две строки в file2 для одной строки с некоторым разделителем magi c (я выбрал !
ниже), затем сортируйте его и сортируйте file1, а затем просто join
их. -v2
заставляет join
выводить неисправимые строки из второго файла - ie. несоответствующие линии. После этого восстановите новую строку, заменив разделитель magi c !
на новую строку:
join -v2 <(cut -d' ' -f1 file1 | sort) <(sed 'N;s/\n/!/' file2 | sort -k1) |
tr '!' '\n'
Если выходные данные должны быть отсортированы, как в файле2, вы можете нумеровать строки в файле2 и повторно сортировать вывод по номерам строк:
join -11 -22 -v2 <(cut -d' ' -f1 file1 | sort) <(sed 'N;s/\n/!/' file2 | nl -w1 | sort -k2) |
sort -k2 | cut -d' ' -f1,3- | tr '!' '\n'
Проверено на repl