2017-02-13 17 views
1

Я пытаюсь объединить темы this и this вопроса, то есть соответствие каждой строки/строки в File2 с его возникновения (каждая строка встречается только один раз) в File1 при печати всей строки, в которой она встречается, в File2, а также печатать строки между каждым соответствием (т.е. последовательность в File2).AWK/СЭД: соответствие шаблону между файлами и печати все между матчами

File1

>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAA 
GAUUAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAG 
ACCGCGAAUGGCUCAUUAUAUCAGUUAUGGUUCCUUAGA 
ACUUACUACUUGGAUAACUGUGGUAAUUCUAGAGCUAAU 
>GAXI01000526.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAAGAU 
UAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAGUGAAAC 
>GAXI01005455.1.1233 Bacteria;Bacteroidetes;Flavobacteriia;Flavobacteriales;Flavobacteriaceae;Chryseobacterium;Tetrodontophora bielanensis (giant springtail) 
CUUUCGAAAGGAAGAUUAAUACCCCAUAACAUA 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 
AGAAUUUGAUCUUGGUUCAGAUUGAAUGCUGG 
UGCAAGUCGAACGAAGCUAGAGGGCAACCUCU 

File2

>GAXI01000525.151.1950 
>GAXI01006199.29.1525 

То, что я до сих пор:

awk 'FNR==NR{a[$0];next} $1 in a' file2 file1 > output 

, который дает:

>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 

Я хотел бы это:

>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAA 
GAUUAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAG 
ACCGCGAAUGGCUCAUUAUAUCAGUUAUGGUUCCUUAGA 
ACUUACUACUUGGAUAACUGUGGUAAUUCUAGAGCUAAU 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 
AGAAUUUGAUCUUGGUUCAGAUUGAAUGCUGG 
UGCAAGUCGAACGAAGCUAGAGGGCAACCUCU 

Исходные файлы содержат тысячи строк, поэтому быстрый из возможных решений ценится, либо AWK, Sed или что-нибудь еще ...

+1

Ученые IMHO могли получить более быстрые и лучшие результаты с использованием инструментов, предназначенных для их работы. Использование таких инструментов, как https://metacpan.org/release/BioPerl и/или https://metacpan.org/release/FAST, безусловно, позволяет более эффективно достичь целей ... – jm666

+0

Конечно, хотя я не делаю этого типа запросов на ежедневной основе. –

ответ

1

@jO: Попытка:

awk 'FNR==NR{A[$1];next} ($0 ~ /^>/){Q=""} ($1 in A){Q=1} Q{print}' file2 file1 

EDIT: Теперь добавление объяснения для решения.

awk 'FNR==NR  ##### This condition will be TRUE when only file2 is being read. where FNR and NR are the awk's in-built keywords FNR and NR both shows number of lines in a Input_file only difference between them FNR gets RESET when it reads next file and NR keep on increase it's values till all files get read successfully. 
{A[$1];    ##### creating an array named A whose index is $1 first field of file2. 
next}    ##### putting next will skip all the further statements. 
        ##### All further mentioned statements will be executed in file1 only. 
($0 ~ /^>/)   ##### checking if any line is starting with > in file1 
{Q=""}    ##### Making variable named Q as nullified. 
($1 in A)   ##### Checking if current line's $1 is coming into array A, if yes then do following. 
{Q=1}    ##### If current $1 is coming into array A then make variable Q's value to 1. 
Q     ##### Check if Q's value is NOT NULL then do following. 
{print}    ##### print the lines whenever above condition is TRUE which has Q's value is NOT NULL. 
' file2 file1  ##### Mentioning Input_files file2 and file1 here. 
1

вы можете попробовать с awk

awk 'FNR==NR{d[$1]; next}/^>/{f=0}$1 in d{f=1}f' file2 file1 

вы получите

 
>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAA 
GAUUAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAG 
ACCGCGAAUGGCUCAUUAUAUCAGUUAUGGUUCCUUAGA 
ACUUACUACUUGGAUAACUGUGGUAAUUCUAGAGCUAAU 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 
AGAAUUUGAUCUUGGUUCAGAUUGAAUGCUGG 
UGCAAGUCGAACGAAGCUAGAGGGCAACCUCU 
1

Это может работать для вас (GNU СЭД):

sed 's:.*:/^&/bb:' file2 | sed -e ':a' -f - -e 'd;:b;n;/^>/ba;bb' file1 

Transform file2 в матчах печатать fr om file1, иначе удалить несоответствия.

Используйте два вызова sed. Первый использует файл2 для создания regexp для соответствия, второй - для печати строк после соответствия следующему началу записи или конца файла.