Вот подход 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-ое поле текущего и связанное с ним значение в хэше.
ответ дан terdon
23 May 2018 в 18:37
поделиться