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

Нужно выполнить внутреннее соединение двух разных текстовых файлов. В основном я ищу внутренний эквивалент соединения программы соединения GNU. Существует ли такая вещь? Если нет, то 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

5 ответов

Решение

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

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

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

Вот опция 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 построить.

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

grep -F -f file2 file1

Вы можете изменить этот скрипт:

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.

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

paste [option] source files [>destination file]

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

paste file1.txt file2.txt >result.txt
Другие вопросы по тегам