Как найти записи в одном файле, которые соответствуют другому файлу - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть файл (file1) со следующим содержимым:

ENST00000364447.1   116 16.000  0.000000    0.000000
ENST00000364424.1   107 17.000  0.000000    0.000000
ENST00000364180.1   107 17.000  0.000000    0.000000
ENST00000384451.1   107 17.000  0.000000    0.000000
ENST00000362957.1   109 17.000  0.000000    0.000000
ENST00000362478.1   107 17.000  0.000000    0.000000
ENST00000384227.1   107 17.000  0.000000    0.000000
ENST00000365615.1   107 17.000  0.000000    0.000000
ENST00000517091.1   106 17.000  0.000000    0.000000

Мне нужно найти записи в столбце 1 этого файла, которые соответствуют тексту в столбце 10 другого файла (file2):

chr1    HAVANA  gene    29554   31109   .   +   .   gene_id "ENSG00000243485.5"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; level 2; tag "ncRNA_host"; havana_gene "OTTHUMG00000000959.2";
chr1    HAVANA  transcript  29554   31097   .   +   .   gene_id "ENSG00000243485.5"; transcript_id "ENST00000473358.1"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; transcript_type "lincRNA"; transcript_name "RP11-34P13.3-001"; level 2; transcript_support_level "5"; tag "not_best_in_genome_evidence"; tag "dotter_confirmed"; tag "basic"; havana_gene "OTTHUMG00000000959.2"; havana_transcript "OTTHUMT00000002840.1";

В столбце 10 имя находится в "".

Я пробовал grep -F -f file1 file2 > file3, но это невероятно медленно.Я также пробовал несколько разных awk, но я не могу понять синтаксис правильно.Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

pure awk:

awk 'FNR==NR{gsub(/[";]/,"",$10);F[$10];next}( $1 in F )' FilterFile2 DataFile1

, если производительность и размер огромны (> 10000 фильтр), альтернативой может быть

awk '{gsub(/[";]/,"",$10);print "^" $10 "[[:blank:]]"}' FilterFile2 > CleanFilter 
grep -E -f  CleanFilter DataFile1
0 голосов
/ 25 апреля 2018

Попробуйте:

cut -d \" -f 2 < file2 | grep -f - file1

Объяснение:

cut -d \" -f 2 < file2

преобразует

chr1    HAVANA  gene    29554   31109   .   +   .   gene_id "ENSG00000243485.5"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; level 2; tag "ncRNA_host"; havana_gene "OTTHUMG00000000959.2";
chr1    HAVANA  transcript  29554   31097   .   +   .   gene_id "ENSG00000243485.5"; transcript_id "ENST00000473358.1"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; transcript_type "lincRNA"; transcript_name "RP11-34P13.3-001"; level 2; transcript_support_level "5"; tag "not_best_in_genome_evidence"; tag "dotter_confirmed"; tag "basic"; havana_gene "OTTHUMG00000000959.2"; havana_transcript "OTTHUMT00000002840.1";

в

ENSG00000243485.5
ENSG00000243485.5

Затем перейдите кgrep, где -f arg указывает -, который является псевдонимом для STDIN.

Если ваш второй файл большой и имеет много одинаковых имен, вы можетеиспользуйте sort -u до grep:

cut -d \" -f 2 < file2 | sort -u | grep -f - file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...