Вы можете сделать три поля в одной строке awk.Вот доказательство:
[ghoti@pc ~]$ cat file1
chr10 1000 1001 DEL 2.4807 chr10 7443 8978
chr10 1005 1008 DEL 1.2799 chr10 7321 8778
[ghoti@pc ~]$ cat file2
chr13 3456 6746 chr10 7443 8978
chr13 6453 8767 chr10 7321 8778
[ghoti@pc ~]$ awk 'NR == FNR { what[$(NF-2),$(NF-1),$(NF)] = $0; next; } { printf("%s %s\n", what[$(NF-2),$(NF-1),$(NF)], $0); }' file1 file2
chr10 1000 1001 DEL 2.4807 chr10 7443 8978 chr13 3456 6746 chr10 7443 8978
chr10 1005 1008 DEL 1.2799 chr10 7321 8778 chr13 6453 8767 chr10 7321 8778
[ghoti@pc ~]$
Если вы хотите, чтобы файлы были в другом порядке, просто измените порядок $0
и what[]
в printf ().
Обратите внимание, что этопредполагается, что вы в порядке с загрузкой всего содержимого первого файла в массив в памяти.Вероятно, не следует использовать файлы с миллионами строк, но это будет полностью зависеть от системы, в которой вы работаете.
Как это работает?
Скрипт awk состоит из двух основных разделов, каждый в фигурных скобках.Первый раздел выполняется ТОЛЬКО, если NR (текущий номер записи всех прочитанных данных) соответствует FNR (номер записи в текущем файле).Другими словами, он действует только на первый файл.Первый файл загружается в память в ассоциативном массиве, индекс которого является последними тремя полями строки.
Второй раздел действует на каждый последующий файл после первого.Он просто печатает текущую строку, но добавляет к ней содержимое массива (соответствует в первом разделе), которое соответствует последним трем полям текущей строки.