grep точное совпадение строки с алфавитами и цифрами - PullRequest
1 голос
/ 11 июня 2019

Я использую grep для извлечения строк из файла 1, совпадающих со строкой в ​​файле2. Строка в файле 2 имеет как алфавиты, так и цифры. например;

MSTRG.18691.1
MSTRG.18801.1

Я использовал sed, чтобы написать границы слов для всех строк в файле 2.

file 2
\<MSTRG.18691.1\>
\<MSTRG.18801.1\>

и используется grep -f file2 file1

но вывод имеет

MSTRG.18691.1.2
MSTRG.18801.1.3 also..

Я хочу, чтобы строки точно совпадали,

MSTRG.18691.1
MSTRG.18801.1

а не

MSTRG.18691.1.2
MSTRG.18801.1.3

Несколько строк из моего файла1
t_name gene_name FPKM TPM<br> MSTRG.25.1 . 0 0<br> rna71519 . 93.398872 194.727926057583<br> gene34024 ND1 2971.72876 6195.77694943117<br> MSTRG.28.1 . 0 0<br> MSTRG.28.2 . 0 0<br> rna71520 . 33.235409 69.2927240732149

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Обновление ответа

Вы можете использовать операторы start with ^ и end with $, чтобы сопоставить начало и начало. Чтобы точно соответствовать MSTRG.18691.1 , вы можете добавить ^ & $ на обоих концах и удалить границы слова, кроме того, . имеет специальное значение для соответствия регулярному выражению ровно . нам нужно избежать этого с обратной косой чертой \

Пример шаблона:

^MSTRG\.18691\.1$
^MSTRG\.18801\.1$

file1

MSTRG.18691.1
MSTRG.1311.1
MSTRG.18801.2
MSTRG.18801.3
MSTRG.18801.1.2
MSTRG.18801.1.1
MSTRG.18801.1
PrefixMSTRG.18801.1

Просто создайте обычный файл с именем file1 и вставьте в него вышеуказанное содержимое.

file2 (файл шаблона)

^MSTRG\.18801\.1$

Просто создайте обычный файл с именем file2 и вставьте в него вышеуказанное содержимое.

Запустите приведенную ниже команду из командной строки

grep -i --color -f file2 file1

Результат:

MSTRG.18801.1

Sed для добавления изменений в файл шаблона

Вот sed command для экранирования . и добавления ^ и $ в начале и конце файла шаблона, который у вас уже есть.

sed -Ee 's/\./\\./g' -e 's/^/\^/g' -e 's/$/\$/g' file2 > file2_updated

-E для поддержки расширенного регулярного выражения в BSD sed, вам может потребоваться заменить -E на -r в зависимости от sed вашей системы

Обновленные шаблоны будут сохранены в file2_updated. Нужно использовать новый файл шаблона в grep, как это

grep -i -f file2_updated file1
0 голосов
/ 11 июня 2019

Флаг, который вы ищете - -F. От man grep:

-F, --fixed-strings

Интерпретировать PATTERN как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любой из которых должен соответствовать.

Вы можете использовать это довольно удобно в сочетании с -f:

grep -Ff file2 file1

Для ясности, каждая строка file2 будет считаться точным совпадением с file1.

...