Как разобрать столбец из одного файла в нескольких других столбцах и объединить вывод? - PullRequest
1 голос
/ 16 января 2020

У меня есть один файл, подобный этому:

head allGenes.txt
ENSG00000128274
ENSG00000094914
ENSG00000081760
ENSG00000158122
ENSG00000103591
...

, и у меня есть несколько файлов с именем, подобным этому * .v7.egenes.txt в текущем каталоге. Например, один файл выглядит так:

head Stomach.v7.egenes.txt
ENSG00000238009 RP11-34P13.7  1  89295 129223  - 2073 1.03557 343.245
ENSG00000237683   AL627309.1  1 134901 139379  - 2123 1.02105 359.907
ENSG00000235146 RP5-857K21.2  1 523009 530148  + 4098 1.03503 592.973
ENSG00000231709 RP5-857K21.1  1 521369 523833  - 4101 1.07053 559.642
ENSG00000223659 RP5-857K21.5  1 562757 564390  - 4236 1.05527 595.015
ENSG00000237973 hsa-mir-6723  1 566454 567996  + 4247 1.05299 592.876 

Я хотел бы получить строки из всех файлов * .v7.egenes.txt, которые соответствуют любой записи в allGenes.txt

Я пытался использовать :

grep -w -f allGenes.txt *.v7.egenes.txt > output.txt

но на это уйдет вечность. Есть ли способ сделать это в awk или?

Ответы [ 3 ]

2 голосов
/ 16 января 2020

Не зная размера файлов, но предполагая, что хост имеет достаточно памяти для хранения allGenes.txt в памяти, приходит на ум одно решение awk:

awk 'NR==FNR { gene[$1] ; next } ( $1 in gene )' allGenes.txt *.v7.egenes.txt > output.txt

Где:

  • NR==FNR - этот тест соответствует только первому обрабатываемому файлу (allGenes.txt)
  • gene[$1] - сохранить каждый ген как индекс в ассоциативном массиве
  • next остановить обработку и go перейти к следующей строке в файле
  • $1 in gene - применяется ко всем строкам во всех других файлах; если в нашем ассоциативном массиве первое поле будет индексом, то мы печатаем текущую строку

. Я бы не ожидал, что это будет выполняться намного быстрее, чем решение grep, которым является OP в настоящее время используется (особенно с предложением приюта использовать -F вместо -w), но это должно быть относительно быстро, чтобы проверить и увидеть ....

1 голос
/ 16 января 2020

В GNU Parallel есть целый раздел, посвященный очистке n строк для m регулярных выражений: https://www.gnu.org/software/parallel/man.html#EXAMPLE: - Grepping-n-lines-for-m-регулярных выражений

0 голосов
/ 16 января 2020

Вы можете попробовать с чтением l oop:

#!/bin/bash

while read -r line; do
  grep -rnw Stomach.v7.egenes.txt -e "$line" >> output.txt
done < allGenes.txt

Так что здесь скажите while l oop, чтобы прочитать все строки из allGenes.txt, и для каждой строки проверьте есть ли совпадающие строки в файле egenes. Будет ли это сделать трюк?

РЕДАКТИРОВАТЬ:

Новая версия:

#!/bin/bash

for name in $(cat allGenes.txt); do
  grep -rnw *v7.egenes.txt* -e $name >> output.txt
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...