Объедините два текста, которые разделяют PATTERN, используя код bash - PullRequest
2 голосов
/ 28 марта 2012

У меня есть два следующих текстовых файла:

Первый:

chr10   1000    1001    DEL 2.4807  chr10   7443    8978
chr10   1005    1008    DEL 1.2799  chr10   7321    8778

Второй:

chr13  3456  6746  chr10 7443   8978
chr13  6453  8767  chr10 7321   8778

Мы видим, что у них есть общий шаблон:

chr10   7443    8978
chr10   7321    8778

Итак, основываясь на этом шаблоне, как я могу объединить их в:

chr10   1000    1001    DEL 2.4807  chr10   7443    8978 chr13  3456  6746
chr10   1005    1008    DEL 1.2799  chr10   7321    8778 chr13  6453  8767

БЛАГОДАРЯ

редактирование: Я пробовал grep как:

cat text1|grep -f `cat text2|awk '{print $4"\t"$5"\t"$6}'`

но это не работает

1 Ответ

3 голосов
/ 28 марта 2012

Вы можете сделать три поля в одной строке 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 (номер записи в текущем файле).Другими словами, он действует только на первый файл.Первый файл загружается в память в ассоциативном массиве, индекс которого является последними тремя полями строки.

Второй раздел действует на каждый последующий файл после первого.Он просто печатает текущую строку, но добавляет к ней содержимое массива (соответствует в первом разделе), которое соответствует последним трем полям текущей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...