В awk этого довольно легко добиться:
$ awk 'NR==FNR{a[$2]=$1; next}{print $1,a[$1]}' file1.txt file2.txt
3AG33662AAAC
3KC12828ACBA 14
8DG59242BAAD 43
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF 25
8DG60568AAAC
8DG60912AAAF 6
8DG62635AAAC
Ничего особенного не происходит - этот метод часто используется теми, кто часто использует awk
, особенно при обработке нескольких файлов, и он основан на идее загрузки информации из первого файла в массив.
Это работает просто. Сначала, используя NR == FNR
(сравнение между текущим номером обрабатываемой строки и номером строки в текущем файле), мы читаем все из file1.txt
(в примере OP это s2.txt
) в ассоциативный массив значений. Ключевое слово next
позволяет нам пропустить следующий кодовый блок, пока мы все еще находимся в первом файле. Как только мы выйдем из первого файла, будет выполнен следующий кодовый блок, всегда печатающее поле 1 и соответствующий элемент в массиве, если он существует.
Используя ту же идею, что и awk, мы можем добиться аналогичного результата в Perl, например:
perl -lane 'if($F[1]){$hash{$F[1]}=$F[0]}else{print "$_ $hash{$_}"}' file1.txt file2.txt