Внутреннее соединение в двух текстовых файлах

Глядя на выполнение внутреннего соединения на двух разных текстовых файлах. В основном я ищу внутренний эквивалент совместной программы GNU join. Существует ли такая вещь? В противном случае решение awk или sed было бы наиболее полезным, но мой первый выбор был бы командой Linux.

Вот пример того, что я хочу сделать

файл 1:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
0|App - CSCE Certificate LUA|Admit Type
1|App - CSCE Certificate LUA|Alias 1
2|App - CSCE Certificate LUA|Alias 2
3|App - CSCE Certificate LUA|Alias 3
4|App - CSCE Certificate LUA|Alias 4

файл 2:

Alien Registration Card LUA

Результаты:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB

Ответы

Ответ 1

Должен ли файл2 содержать LUA в конце?

Если да, вы все равно можете использовать join:

join -t'|' -12 <(sort -t'|' -k2 file1) file2

Ответ 2

Вы можете изменить этот script:

cat file2 | while read line; do
    grep $line file1 # or whatever you want to do with the $line variable
done

while цикл считывает файл2 по строкам и передает эту строку команде grep, которая разделяет эту строку в файле1. Есть некоторые дополнительные выходные данные, которые могут быть удалены с помощью параметров grep.

Ответ 3

Здесь опция awk, поэтому вы можете избежать зависимости bash (для переносимости):

$ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1

Как это работает?

  • -F'|' - устанавливает разделитель полей
  • 'NR==FNR{check[$0];next} - если общий номер записи соответствует номеру записи файла (т.е. мы читаем первый предоставленный файл), мы заполняем массив и продолжаем.
  • $2 in check - Если второе поле было упомянуто в созданном массиве, напечатайте строку (это действие по умолчанию, если никаких действий не предусмотрено).
  • file2 file1 - файлы. Порядок важен из-за конструкции NR==FNR.

Ответ 4

Похоже, вам просто нужно

grep -F -f file2 file1

Ответ 5

Вы можете использовать команду вставки для объединения файла:

paste [option] source files [>destination file]

для вашего примера это будет

paste file1.txt file2.txt >result.txt