Как объединить значения из двух разных текстовых файлов?

У меня есть следующие данные в текстовых файлах:

file1.txt

a1:b1
a2:b2
a3:b3
a4:b4
a5:b5

file1.txt

b2:c1
b4:c2
b5:c3

Как объединить эти значения, чтобы сделать выходной файл следующим образом:

output.txt

a2:c1
a4:c2
a5:c3
1
задан 30 July 2015 в 20:37

1 ответ

Вот подход awk:

awk -F: '(NR==FNR){a[$2]=$1; next}($1 in a){print a[$1]":"$2};' file1 file2 > out

Пояснение

awk -F: Запустите awk, установив разделитель полей на :. Это прочитает каждую строку ввода и разделит ее на :. Итак, для первой строки file1 первое поле ($1) - a1, а второе ($2) - b1. (NR==FNR){}: Если NR равно FNR. NR - текущий номер строки ввода, а FNR - номер строки текущего файла. Эти два будут равны только при чтении первого файла. a[$2]=$1; next: сохранить второе поле в качестве ключа в массиве a, значение которого является 1-м полем. Затем перейдите к следующей строке. ($1 in a){print a[$1]":"$2}: это будет выполняться только при чтении второго файла. Если первым полем второго файла является массив ключей a, напечатайте значение для этого ключа (второе поле соответствующей строки из file1).

И Perl one:

perl -F: -lanE '$k{$F[0]} ? say "$k{$F[0]}:$F[1]" : ($k{$F[1]}=$F[0]);' file1 file2 > out

Или, если вы предпочитаете:

perl -F: -lanE '$k{$F[0]} and say "$k{$F[0]}:$F[1]" or ($k{$F[1]}=$F[0]);' file1 file2 

Пояснение

awk -F: Запустите awk, установив разделитель полей на :. Это прочитает каждую строку ввода и разделит ее на :. Итак, для первой строки file1 первое поле ($1) - a1, а второе ($2) - b1. $k{$F[0]} ? foo : bar: Если переменная $k{$F[0]} определяется, do foo, else do bar. (NR==FNR){}: Если NR равно FNR. NR - текущий номер строки ввода, а FNR - номер строки текущего файла. Эти два будут равны только при чтении первого файла. say "$k{$F[0]}:$F[1]": это будет работать, если определено $k{$F[0]} («foo» выше), поэтому, если первое поле текущей строки было вторым полем в другой строке. Если это так, print (say походит на print, но добавляет новую строку) 1-ое поле текущего и связанное с ним значение в хэше.
5
ответ дан 23 May 2018 в 18:37
  • 1
    Отлично :) если можно так сказать. – A.B. 31 July 2015 в 07:56
  • 2
    Ницца! Для awk может быть даже более чистым установить OFS вместо жесткого кодирования при печати. Мне нравится делать это с BEGIN {FS=OFS=":"} для таких случаев, когда FS и OFS одинаковы. – fedorqui 31 July 2015 в 12:56

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

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