Проблема изменить вхождение в файл с помощью sed - PullRequest
1 голос
/ 21 июня 2019

У меня есть файл с несколькими строками:

OTU3055 UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2
OTU0856 OTU53699 UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3
OTU0125 UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2

Я хочу удалить все вхождения OTUXXXX (всегда есть 4 числа после «OTU»), который появляется в файле.Я использовал sed, но это не сработало.OTUXXXX всегда появляется в начале строк.

sed 's/OTU[0-9]{4} //g' my_file.txt

Я ставлю пробел после OTU[0-9]{4}, потому что я хочу, чтобы идентификаторы Uniref90 были в начале каждой строки.

Редактировать:

sed -r 's/OTU[0-9]{4} //g' my_file.txt работает.Но у меня возникает другая проблема:

UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2
 UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3
UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2

Некоторые строки по-прежнему начинаются с пробела.Я попытался sed 's/^ *//' my_file.txt, и это не работает.Я хочу, чтобы вторая строка моего файла начиналась как две другие строки без пробелов.

Ответы [ 2 ]

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

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

sed -r 's/[[:space:]]*\bOTU[0-9]{4,}\b[[:space:]]*//g' file > newfile

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

sed -r 's/[[:space:]]*\bOTU[0-9]{4,}\b//g' file | sed 's/[[:space:]]*$//' > newfile

Пробелы после OTU<digits> не будут сопоставляться со вторым фрагментом, поэтому необходима команда sed для передачи по каналу.

См. онлайн-демо .

Детали

  • [[:space:]]* - 0+ пробельных символов
  • \b граница слова
  • OTU[0-9]{4,} - OTU и 4 или более цифр
  • \b - граница слова
  • [[:space:]]* - 0+ пробельных символов.
0 голосов
/ 21 июня 2019

Нет никакого объяснения для вашего опубликованного фактического вывода, учитывая ваш опубликованный ввод и команду, которую вы выполнили, но если вы хотите сопоставить 4 или более цифр, и пробел после строк OTU * может быть табуляцией или некоторым другим пробелом, который не пустой символ, это то, что вам нужно, используя GNU или OSX / BSD awk для -E:

$ sed -E 's/(OTU[0-9]{4,}[[:space:]]+)+//' file
UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2
UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3
UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...