Просто инвертируйте порядок, в котором Вы печатаете и печатаете строку, в которой Вы нуждаетесь справа сначала:
printf "%5s1";printf "3\r%4s2\n"
Вы можете использовать контурную контуру:
$ 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
Если вы не возражаете против дополнительного столбца с номером в нем, вы можете использовать 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