Попытка объединить два текстовых файла на основе первого столбца в обоих файлах и сохранить все столбцы совпадений из второго файла - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь объединить два текстовых файла на основе их первых столбцов, и если эти столбцы совпадают, я хочу сохранить все столбцы из второго файла.

List1.txt
action
adan
adap
adapka
adat
yen


List2.txt
action  e KK SS @ n
adham   a d h a m
adidas  a d i d a s
administration  e d m i n i s t r e SS @ n
administrative  e d m i n i s t r e t i v
admiral e d m aj r @ l
adnan   a d n a n
ado     a d o
adan    a d @ n
adap    a d a p
adapka  a d a p k a
adrenalin       @ d r e n @ l i n
adrian  a d r j a n
adat    a d a t
adtec   e d t e k
adult   @ d a l t
yen     j e n

Я бы хотел получить из list1.txt все, что соответствует list2.txt плюс все остальные столбцы в list2.txt. List3.txt должно выглядеть следующим образом.

List3.txt
action  e KK SS @ n
adan    a d @ n
adap    a d a p
adapka  a d a p k a
adat    a d a t
yen     j e n

Я пробовал следующую команду из здесь :

$awk -F: 'FNR==NR{a[$1]=$0;next}{if($1 in a){print a[$1];} else {print;}}'  List1.txt List2.txt > List3.txt

Я также пробовал это:

$comm <(sort List2.txt) <(sort List1.txt)

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я уверен, что есть способы сделать это с помощью awk, но объединение также относительно просто.

join -1 1 -2 1 List1.txt <(sort -k 1,1 List2.txt) > List3.txt

Вы присоединяетесь к List1 на основе первого столбца и также присоединяетесь к List2 на основе первого столбца. Затем вам нужно убедиться, что файлы отсортированы в алфавитном порядке, чтобы объединение могло работать.

Это создает нужные столбцы, разделенные пробелами.

List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
0 голосов
/ 18 марта 2020

Другой простой способ достижения sh того, что вы пытаетесь сделать, - это grep, используя значения в List1.txt для сопоставления как fixed-string содержимое в List2.txt, перенаправляя результат на List3.txt, например

grep -Ff List1.txt List2.txt > List3.txt

При использовании GNU grep или с -w, --word-regex доступно добавление -w обеспечивает совпадение только целого слова, например

grep -Fwf List1.txt List2.txt > List3.txt

Результирующий List3.txt

$ cat List3.txt
action  e KK SS @ n
adan    a d @ n
adap    a d a p
adapka  a d a p k a
adat    a d a t
yen     j e n

( примечание: все пробелы сохраняются в List3.txt)

...