Код Bash для разделения каждой 4-й строки, а затем слияния - PullRequest
2 голосов
/ 18 ноября 2011

Возможно, мой заголовок не может полностью объяснить мое намерение. У меня есть список данных, как показано ниже:

@HWI-ST150_0129:3:8:21208:93107#0/1
TGTCTAGTTTTTATAGGAAGATATTTCCTTTTCTACCTTTGACTTCAAAGCGGCTGAAATCTCCACTTGCAAATTCCACAAAAAGAGTGTTACAAGTCT
+
Yeeeeeeeeeceed]dddddd^YdceeeedaeeddYccccc\ddceeYeYY`[`bcYc^_XY^_]d^dd`abdddee\e\ddLb]`_`cTbbbYbaM_]
@HWI-ST150_0129:3:8:21208:93107#0/2
TTTGTAAAGTCTGCACGTGGATAACTTGACCACTTAGAGGCCTTCGTTGGAAACGGGTTTTTTTCATGTAAGGCTAGACAGAAGAATTCTCAGTAACTTCAAGTTACTGAGAATTCTTCTGTCTAGCCTTACATGAAAAAAACCCGTTTCCAACGAAGGCCTCTAAGTGGTCAAGTTATCCACGTGCAGACTTTACAAA
+
ffcaefffcdeeeeeeeeeedff^f`\\eeedaec^d^d`deaffeeTecb^bbbddadYcccW[X\MZ\XaU_UTI\]TZ]K[VQX^aIb`b`^X^YSYHWI-ST150_0129:3:8:21208:93107#0

Мы можем видеть, что первая строка и 5-я строка имеют заголовок / имя, но заканчиваются либо # 0/1, либо # 0/2. Теперь я надеюсь сгруппировать каждые 4 строки, но позже объединю все те с # 0/1 вместе и # 0/2 вместе.

Должно быть как:

@HWI....#0/1
TTCCGC
+
cffccc
@HWI....#0/1
CCGGGG
+
abbcgg
....

также другой файл: @HWI .... # 0/1 ATTCCG + fccfcc @HWI .... # 0/1 CGCCGG + gbbcaa

Я знаю, как сделать это с помощью простого скрипта на Python. Но просто интересно, можем ли мы сделать только какой-нибудь довольно простой bash-код? Спасибо

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

sed -n '1,${p;n;n;n;}' должно работать для получения каждой 4-й строки:

[ 11:32 jon@hozbox.com ~/SO/bash ]$ cat blah | sed -n '1,${p;n;n;n;}'
@HWI-ST150_0129:3:8:21208:93107#0/1
@HWI-ST150_0129:3:8:21208:93107#0/2

[ 11:33 jon@hozbox.com ~/SO/bash ]$ cat blah
@HWI-ST150_0129:3:8:21208:93107#0/1
TGTCTAGTTTTTATAGGAAGATATTTCCTTTTCTACCTTTGACTTCAAAGCGGCTGAAATCTCCACTTGCAAATTCCACAAAAAGAGTGTTACAAGTCT
+
Yeeeeeeeeeceed]dddddd^YdceeeedaeeddYccccc\ddceeYeYY`[`bcYc^_XY^_]d^dd`abdddee\e\ddLb]`_`cTbbbYbaM_]
@HWI-ST150_0129:3:8:21208:93107#0/2
TTTGTAAAGTCTGCACGTGGATAACTTGACCACTTAGAGGCCTTCGTTGGAAACGGGTTTTTTTCATGTAAGGCTAGACAGAAGAATTCTCAGTAACTTCAAGTTACTGAGAATTCTTCTGTCTAGCCTTACATGAAAAAAACCCGTTTCCAACGAAGGCCTCTAAGTGGTCAAGTTATCCACGTGCAGACTTTACAAA
+
ffcaefffcdeeeeeeeeeedff^f`\\eeedaec^d^d`deaffeeTecb^bbbddadYcccW[X\MZ\XaU_UTI\]TZ]K[VQX^aIb`b`^X^YSYHWI-ST150_0129:3:8:21208:93107#0

Полезные однострочные скрипты для sed
man sed

0 голосов
/ 19 ноября 2011

Я не уверен, что понимаю вас, однако получение каждой 4-й строки тривиально с GNU sed:

sed '1~4!d' file

До group четырех строк, под которыми, как я полагаю, вы подразумеваете сокращение 4 строк до одной:

sed '/#0\/[12]$/{N;N;N;s/\n//;d}' file

При этом используется регулярное выражение, которое вы упомянули выше, т.е. строка, заканчивающаяся #0/1 или #0/2

...