Страница 1 из 1

вопрос по awk и sed

Добавлено: 2010-05-16 1:34:12
Reiser
Есть файл типа

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

>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

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

Добавлено: 2010-05-16 3:53:13
x6e6564
возможно коряво, но тоже вариант

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

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/'

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

Добавлено: 2010-05-16 14:10:49
Reiser
вот что-то мой sed не переваривает sed 's/>/\n/' - заменяет > на просто n.

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

Добавлено: 2010-05-16 15:56:47
Гость
должно работать не только ня фряшном, но и на gsed 4.2.1. Ты не путаешь y/>/\n/ с s/>/\n/?