вопрос по awk и sed

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Reiser
рядовой
Сообщения: 22
Зарегистрирован: 2010-04-21 17:28:07

вопрос по awk и sed

Непрочитанное сообщение Reiser » 2010-05-16 1:34:12

Есть файл типа

Код: Выделить всё

>10MH:A|PDBID|CHAIN|SEQUENCE
MIEIKDKQLTGLRFIDLFAGLGGFRLALESCGAECVYSNEWDKYAQEVYEMNFGEKPEGDITQVNEKTIPDHDILCAGFP
CQAFSISGKQKGFEDSRGTLFFDIARIVREKKPKVVFMENVKNFASHDNGNTLEVVKNTMNELDYSFHAKVLNALDYGIP
QKRERIYMICFRNDLNIQNFQFPKPFELNTFVKDLLLPDSEVEHLVIDRKDLVMTNQEIEQTTPKTVRLGIVGKGGQGER
IYSTRGIAITLSAYGGGIFAKTGGYLVNGKTRKLHPRECARVMGYPDSYKVHPSTSQAYKQFGNSVVINVLQYIAYNIGS
SLNFKPY
>10MH:C|PDBID|CHAIN|SEQUENCE
GTCAGCGCATGG
>10MH:B|PDBID|CHAIN|SEQUENCE
CCATGCGCTGAC

Необходимо привести к виду

Код: Выделить всё

>10MH:A|PDBID|CHAIN|SEQUENCE MIEIKDKQLTGLRFIDLFAGLGGFRLALESCGAECVYSNEWDKYAQEVYEMNFGEKPEGDITQVNEKTIPDHDILCAGFPCQAFSISGKQKGFEDSRGTLFFDIARIVREKKPKVVFMENVKNFASHDNGNTLEVVKNTMNELDYSFHAKVLNALDYGIPQKRERIYMICFRNDLNIQNFQFPKPFELNTFVKDLLLPDSEVEHLVIDRKDLVMTNQEIEQTTPKTVRLGIVGKGGQGERIYSTRGIAITLSAYGGGIFAKTGGYLVNGKTRKLHPRECARVMGYPDSYKVHPSTSQAYKQFGNSVVINVLQYIAYNIGSSLNFKPY
>10MH:C|PDBID|CHAIN|SEQUENCE GTCAGCGCATGG
>10MH:B|PDBID|CHAIN|SEQUENCE CCATGCGCTGAC
(Первая и вторая строки - это одно целое, т.к. такие длины строк парсер переносит)
Т.е. убрать разбиение по ширине на 80, склеить всё в строки, начинающиеся с ">", убрать лишние пробелы, оставив только между |SEQUENCE и последующим.

Решение уже написано, но оно получилось корявым трёхэтажным awk. Какой наиболее красивый способ?

Моё решение:

Код: Выделить всё

gawk '{printf $0" "}' input.txt | gawk 'BEGIN {RS=">"} {if (NR!=1) {print ">"$0}}' | sed 's/ //g' | sed 's/|SEQUENCE/|SEQUENCE /' | grep :$j | tr " " "\n" >> a.out

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

x6e6564
проходил мимо

Re: вопрос по awk и sed

Непрочитанное сообщение x6e6564 » 2010-05-16 3:53:13

возможно коряво, но тоже вариант

Код: Выделить всё

cat ~/test | xargs | tr '\>' '\n' | sed '1d; s/^/\>/g; s/ //g; s/|SEQUENCE/|SEQUENCE /g'

Гость
проходил мимо

Re: вопрос по awk и sed

Непрочитанное сообщение Гость » 2010-05-16 12:15:14

Reiser писал(а):корявым трёхэтажным awk
ты о переносе строк не слышал? Anyway, че-то у тя длинно получилось и ти использовал не только awk. Конкретно для твоего примера можно так

Код: Выделить всё

$ gawk '/>/ { if(NR != 1) printf "\n"; printf $0" " } !/>/ { printf $0 }' input.txt

Гость
проходил мимо

Re: вопрос по awk и sed

Непрочитанное сообщение Гость » 2010-05-16 12:19:03

с переносами строк это будет выглядеть так

Код: Выделить всё

$ gawk '
/>/ {
    if(NR != 1)
        printf "\n"
    printf $0" "
}

!/>/ {
    printf $0
}
' input.txt

Гость
проходил мимо

Re: вопрос по awk и sed

Непрочитанное сообщение Гость » 2010-05-16 12:25:46

x6e6564 писал(а):tr '\>' '\n'
это можно заменить на

Код: Выделить всё

sed 'y/>/\n/'

Reiser
рядовой
Сообщения: 22
Зарегистрирован: 2010-04-21 17:28:07

Re: вопрос по awk и sed

Непрочитанное сообщение Reiser » 2010-05-16 14:10:49

вот что-то мой sed не переваривает sed 's/>/\n/' - заменяет > на просто n.

Гость
проходил мимо

Re: вопрос по awk и sed

Непрочитанное сообщение Гость » 2010-05-16 15:56:47

должно работать не только ня фряшном, но и на gsed 4.2.1. Ты не путаешь y/>/\n/ с s/>/\n/?