Объедините два файла с awk

File1.txt

item1   carA
item2   carB
item3   carC
item4   platD
item5   carE

File2.txt

carA  platA
carB  platB
carC  platC
carE  platE

Требуемый вывод:

item1   platA
item2   platB
item3   platC
item4   platD
item5   platE

Как я могу сделать это?

9
задан 20 March 2018 в 05:38

2 ответа

Ниже ответа основан на подобных Вопросах и ответах в ТАК с некоторыми соответствующими модификациями:

$ awk 'FNR==NR {dict[$1]=$2; next} {$2=($2 in dict) ? dict[$2] : $2}1' file2.txt file1.txt 
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE

Идея состоит в том, чтобы создать карту хеша с индексом и использовать его в качестве словаря.

Для 2-го вопроса Вы спросили в своем комментарии (из чего должен быть изменен если второй столбец file1.txt будет шестой столбец):

Если входной файл будет похож file1b.txt :

item1 A5 B C D carA
item2 A4 1 2 3 carB
item3 A3 2 3 4 carC
item4 A2 4 5 6 platD
item5 A1 7 8 9 carE

Следующая команда сделает это:

$ awk 'FNR==NR {dict[$1]=$2; next} {$2=($6 in dict) ? dict[$6] : $6;$3="";$4="";$5="";$6=""}1' file2.txt file1b.txt 
item1 platA    
item2 platB    
item3 platC    
item4 platD    
item5 platE    
11
ответ дан 23 November 2019 в 04:51

Я знаю, что Вы сказали awk, но существует a join команда с этой целью...

{
  join -o 1.1,2.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)     
  join -v 1 -o 1.1,1.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt) 
} | sort -k 1

Это было бы достаточно с первым join управляйте, не было ли это для этой строки:

item4   platD

Команда в основном говорит: соединение на основе второго столбца первого файла (-1 2), и первый столбец второго файла (-2 1), и вывод первый столбец первого файла и второй столбец второго файла (-o 1.1,2.2). Тот единственные шоу строки, которые соединились. Вторая команда соединения говорит почти то же самое, но это говорит для показа строк из первого файла, который не мог быть соединен (-v 1), и вывод первый столбец первого файла и второй столбец первого файла (-o 1.1,1.2). Затем мы сортируем вывод обоих объединенных. sort -k 1 вид средств на основе первого столбца, и sort -k 2 средства отсортировать на основе второго. Важно отсортировать файлы на основе объединяющего столбца прежде, чем передать их join.

Теперь, я записал сортировку дважды, потому что мне не нравится замусорить мои каталоги файлами, если я могу помочь ей. Однако как David Foerster сказал, в зависимости от размера файлов, Вы могли бы хотеть отсортировать файлы и сохранить их сначала, чтобы не иметь, ожидают для сортировки каждого дважды. Для давания общее представление о размерах вот, время, которое требуется для сортировки 1 миллиона и 10 миллионов строк на моем компьютере:

$ ruby -e '(1..1000000).each {|i| puts "item#{i}   plat#{i}"}' | shuf > 1million.txt 
$ ruby -e '(1..10000000).each {|i| puts "item#{i}   plat#{i}"}' | shuf > 10million.txt 
$ head 10million.txt 
item530284   plat530284
item7946579   plat7946579
item1521735   plat1521735
item9762844   plat9762844
item2289811   plat2289811
item6878181   plat6878181
item7957075   plat7957075
item2527811   plat2527811
item5940907   plat5940907
item3289494   plat3289494
$ TIMEFORMAT=%E
$ time sort 1million.txt >/dev/null
1.547
$ time sort 10million.txt >/dev/null
19.187

Это составляет 1,5 секунды для 1 миллиона строк, и 19 секунд для 10 миллионов строк.

6
ответ дан 23 November 2019 в 04:51

Другие вопросы по тегам:

Похожие вопросы: