Команда join
выполняет работу по объединению совпадающих строк из нескольких файлов. Но у него есть некоторые требования к входным файлам, поэтому вам нужно будет создать несколько временных файлов с несколькими дополнительными полями.
awk '{printf $2" "$3" "$4" "$5"%"$1"%"; $1="";print $0 "%" NR }' < file1 | sort > 1.tmp
awk '{print $1" "$4" "$5" "$6"%"$2} $5 != $6 {print $1" "$4" "$6" "$5"%"$2}' < file2 | sort > 2.tmp
join -a 1 -t % -o 1.4 2.2 1.2 1.3 1.tmp 2.tmp | sort -t % -n | awk -F % '!$2{$2=$3}{print $2" "$4}'
Предварительная обработка первого файла:
awk '{printf $2" "$3" "$4" "$5"%"$1"%"; $1="";print $0 "%" NR }''
Пример вывода:
1 118630 C T%1:118630% 1 118630 C T 0.99 -0.033 0.055 5.5e-01 226311%4
Эти 4 поля, разделенные %
, являются:
sort
)Этот вывод передается через sort
во временный файл, поскольку join
требует сортировки входных данных.
Для второго файла:
awk '{print $1" "$4" "$5" "$6"%"$2} $5 != $6 {print $1" "$4" "$6" "$5"%"$2}'
Пример вывода:
1 118630 C T%1:118630_C_T
1 118630 T C%1:118630_C_T
Поскольку вы указали, что поля 5 и 6 должны совпадать в любом случае, вторая строка печатается с их перестановкой (при условии, что они не идентичны ). Разделенные поля%
-здесь:
Опять же, выходные данные передаются через sort
в другой временный файл.
Затем следует основной этап «объединения»:
join -a 1 -t % -o 1.4 2.2 1.2 1.3 1.tmp 2.tmp
-a 1
указывает join
сохранять строки из первого набора, если во втором нет совпадения. -t %
устанавливает разделитель на %
(, а не на пробел ). Аргумент -o
создает следующие четыре поля вывода:
file2
(при отсутствии совпадений будет пустым)file1
file1
Пример строки вывода:
4%1:118630_C_T%1:118630% 1 118630 C T 0.99 -0.033 0.055 5.5e-01 226311
Затем sort
можно восстановить исходный порядок файлов (сортировка по цифрам, разделитель полей%
)
sort -t % -n
Окончательный awk
проверяет, является ли поле «замена» пустым (, поскольку совпадение не найдено ), и если да, то вместо этого использует исходный столбец1. Он также отбрасывает номер строки и все эти %
s.
awk -F % '!$2{$2=$3}{print $2" "$4}'
Конечная строка вывода:
1:118630_C_T 1 118630 C T 0.99 -0.033 0.055 5.5e-01 226311