Я думаю, что решил это.
awk -F"\t" 'NR==FNR{a[$4]=$4;chr[$4]=$1;start[$4]=$2;end[$4]=$3;next}{if($12 in a) {OFS="\t"; $4="GRCh37"; $7=start[$12]; $8=end[$12]; print $0;} else {print $0}}' file2.txt file1.txt
Эта однострочная команда выводит обновленный file1.txt со столбцами из file2.txt.
Я хотел бы объяснить, что я делать здесь для людей, как я (которые являются новыми для awk). NR == FNR верно только для первого файла по своей природе ( Что такое NR и FNR и что означает "NR == FNR"? ).
Итак, мы получаем 4-й столбец file2.txt в массиве a
. Я также сохраняю 1-й, 2-й и 3-й столбцы файла file2.txt в массивах chr
, start
и end
.
next
давайте перейдем ко второму файлу, который в нашем случае является file1.txt.
Для каждого значения в 12-м столбце file1.txt мы проверяем, находится ли это значение в a
, если да, мы обновляем 4-й, 7-й и 8-й столбцы файла file1.txt с сохраненными значениями в массивах chr
, start
и end
соответственно.
Мы сохранили значения в a, chr, start and end
массивы, использующие $ 4 (используя значения строки, удовлетворенные в 4-м столбце) в качестве индекса. И позже мы получаем соответствующие значения, используя $ 12 (12-й столбец file1) в качестве индекса. Просто подумайте об этом, поскольку мы получаем сохраненные значения с помощью индексации в массивах.
Надеюсь, это будет полезно для других.