Grep для поиска шаблона в файле

Просто инвертируйте порядок, в котором Вы печатаете и печатаете строку, в которой Вы нуждаетесь справа сначала:

printf "%5s1";printf "3\r%4s2\n"
3
17.11.2014, 14:46
3 ответа

Вы можете использовать контурную контуру:

$ while read pat; do 
    grep "$pat" file | 
        while read match do 
            echo -e "$pat\t$match"
        done
 done < patterns 
KO3435  Xxxxx KO3435;folding factor
KO3435  Yyyyy KO3435,xxxx
KO3322  proteinaseK (KO3322)

Я проверял, запустив его в файле uniprot Flat для человека (625 м) и используя 1000 идентификаторов Uniprot в качестве шаблонов. Это заняло ~ 6 минут на ноутбуке Pentium i7. Это заняло ~ 35 секунд, когда я искал только 100 узоров.


Как указано в комментариях ниже, вы можете сделать это немного быстрее, пропустив echo и используя GREP - этикетка и -H Параметры:

$ while read pat; do 
    grep "$pat" --label="$pat" -H < file
done < patterns

Запуск этого на примерных файлах производит:

$ while read pat; do 
    grep "$pat" --label="$pat" -H < kegg.annotations; 
  done < allKO.IDs.txt > test1
terdon@oregano foo $ cat test1 
K02217:>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
K07448:>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein
1
27.01.2020, 21:16

Вы можете использовать ACK :

$ ack "$(tr '\n' '|' < pattern.txt | sed -e 's/.$//')" --print0 --output='$& $_' file.txt
KO3322 proteinaseK (KO3322)
KO3435 Xxxxx KO3435;folding factor
KO3435 Yyyyy KO3435,xxxx
1
27.01.2020, 21:16

Если вы не возражаете против дополнительного столбца с номером в нем, вы можете использовать join и grep для этого.

$ join <(grep -of patterns.txt file.txt | nl) \
       <(grep -f patterns.txt file.txt | nl)
1 KO3322 proteinaseK (KO3322)
2 KO3435 Xxxxx KO3435;folding factor
3 KO3435 Yyyyy KO3435,xxxx
3
27.01.2020, 21:16

Теги

Похожие вопросы