соедините 2 файла на основе 1-го и 2-го столбцов файла И 3-го и 4-го столбцов второго файла

#join #awk #paste

Вопрос:

файл1

 rs12345  G  C  
rs78901  A  T
 

файл2

 3  22745180  rs12345  G  C,G  
12 67182999  rs78901  A  G,T  
 

желаемый результат

 3  22745180  rs12345  G  C  
12 67182999  rs78901  A  T  
 

Я пытался
awk 'NR==FNR {h[$1] = $3; next} {print $1,$2,$3,h[$2]}' file1 file2

сгенерированный результат

 3  22745180  rs12345  
 

выведите первые 4 столбца файла 2 и 3-й столбец файла 1 в качестве 5-го столбца в выводе

Ответ №1:

Вы можете использовать это awk :

 awk 'FNR == NR {map[$1,$2] = $3; next} ($3,$4) in map {$NF = map[$3,$4]} 1' f1 f2 | column -t

3   22745180  rs12345  G  C
12  67182999  rs78901  A  T
 

Более читаемая версия:

 awk '
FNR == NR {
   map[$1,$2] = $3
   next
}
($3,$4) in map {
   $NF = map[$3,$4]
}
1' file1 file2 | column -t
 

Используется column -t только для табличного вывода.

Ответ №2:

В представленном вами случае (строки в обоих файлах совпадают) это сработает

 paste file1 file2 | awk '{print $4,$5,$6,$7,$3}'
 

Комментарии:

1. ВСТАВКА не учитывает порядок строк и не связанных строк в обоих файлах

2. @rij вы не упомянули в своем вопросе, что вам нужен скрипт, который также будет соединять строки. Мой код работает, например, из вашего вопроса.