Необходимо указать числа в команде sed

perl -0ne 'print join "\\", sort split(/^\\/m)' input.txt 

Это основано на ответе Сортировать файл по группе строк , на который ссылается @αғsнιη.

Он разбивает весь входной файл на массив, используя регулярное выражение ^\в качестве разделителя. Затем он печатает отсортированный массив с элементами массива, соединенными одним символом \.

Соединение необходимо, так как оно возвращает символы \, которые были удалены во время операции разделения.


Обратите внимание, что :этот сценарий совершенно не заботится о содержании определений глоссария. Все, что он делает, это разбивает входные данные на массив на основе строк, начинающихся с \.

Это означает, что если есть какие-либо входные строки перед первой записью \newglossary, они будут напечатаны в порядке сортировки (, поскольку они становятся элементом массива 0 ). Если таких строк нет, то элемент массива 0 пуст и печатается первым (, потому что пустая строка сортируется раньше всего остального ), но не производит видимого вывода (, потому что она пуста ).

Если есть строки текста после последней записи \newglossary,они будут напечатаны везде, где эта запись отсортирована, потому что сценарий считает их частью этой записи .

То же самое происходит, если между двумя записями есть произвольный текст. -Эти строки становятся частью первой из этих двух записей.

3
19.01.2021, 14:21
1 ответ

Ваше регулярное выражение ищет «accessory/, а затем одно число ([0-9]), а затем /», чего нет в вашем файле. Вы хотите найти один или несколько номеров , а также разрешить ., который не является числом. Итак, используя ту же логику, что и в оригинале, вам нужно что-то вроде этого:

$ sed -E 's/accessory[/][0-9.]+[/][0-9.]+[/]//' accessory.fasta
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT

Обратите внимание, что я не использовал модификатор g, так как он здесь бесполезен, поскольку в строке будет только одно совпадение.

Однако это излишне ограничительно. Если файл такой, как вы показываете, вы просто хотите удалить все до последнего /в строке:

$ sed -E 's|>.*/|>|' accessory.fasta 
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT

Оператор s///может использовать любой символ в качестве разделителя. Итак, поскольку я знаю, что мне нужно будет сопоставить /, я использовал s|||, чтобы избежать необходимости экранировать /.

Если вам действительно нужно быть таким же строгим, как в оригинале, вы можете упростить до:

$ sed -E 's|accessory/[0-9.]+/[0-9.]+/||' accessory.fasta 
>lake_sample_pv_strain_LH201_chromosome_Gene2509
ATGCTAG
>lake_sample_pv_strain_LH201_Gene125
TAGTCT
8
18.03.2021, 22:36

Теги

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