Соединение разрывов строк в файле FASTA с условием в однострочнике SED / AWK / Perl - PullRequest
6 голосов
/ 02 марта 2010

У меня есть данные, которые выглядят так

> sq1
foofoofoobar
foofoofoo
> sq2
quxquxquxbar
quxquxquxbar
quxx
> sq3
paxpaxpax
pax

Я хочу объединить их в одну строку:

> sq1 foofoofoobarfoofoofoo
> sq2 quxquxquxbarquxquxquxbarquxx
> sq3 paxpaxpaxpax

Я попробовал этот код, но не смог.

sed -e 'te' -e 'H;$!d;:e' -e 'x;/^$/d;s/\n//g'

Какой правильный способ сделать это?

Ответы [ 5 ]

4 голосов
/ 02 марта 2010
$ awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" ":$0 }' file 
> sq1 foofoofoobarfoofoofoo
> sq2 quxquxquxbarquxquxquxbarquxx
> sq3 paxpaxpaxpax
2 голосов
/ 02 марта 2010

Это один из способов сделать то, что вы хотите, используя sed:

sed -n '1{x;d;x};${H;x;s/\n/ /1;s/\n//g;p;b};/^>/{x;s/\n/ /1;s/\n//g;p;b};H'
1 голос
/ 02 марта 2010
perl -ne '!/^>/ ? chomp($p) : (chomp $_, $_.=" "); print $p; $p = $_; END{print $p}

... которая, конечно, могла бы быть написана намного короче, если это необходимо.

0 голосов
/ 25 февраля 2012

Самое короткое sed решение, которое я смог найти:

sed -n '/^>/!{H;$!b};s/$/ /;x;1b;s/\n//g;p'
0 голосов
/ 24 февраля 2012

Это может работать для вас:

sed ':a;$!{N;ba};s/\n//g;s/> sq[0-9]*/\n& /g;s/.//' file

или это:

 sed ':a;$!N;s/\n\([^>]\)/\a\1/;ta;s/\a/ /;s///g;P;D' file

или это:

 awk -vRS='> sq' '{sub(/^/,RS);sub(/\n/," ");gsub(/\n/,"")};NR>1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...