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