2015-08-17 3 views
0

Я искал решение, но не смог найти подходящего.Удалить текст между двумя строками sed, awk

Я хочу удалить все символы между двумя строками на каждой строке.

Input является Fasta-файла:

>CAM_P0000101_READ_00457523 /accession=CAM_P0000101_READ_00457523 /xy=2625_3790 /region=2 /run=R_2008_08_11_16_51_31_ /length=253 /sample_id=1309720343513924875 /sample_acc=CAM_P0000101_SMPL_PAPUT2 /sample_name=CAM_P0000101_SMPL_PAPUT2 /site_id_n=CAM_P0000101_SITE_PAPUT2 
GTGCCTTCGGGAACCGGGTGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTCGTGAGATGTTGGGTTAAGTCCCGTAACGAGCGCAACCCTTGTCCTTAGTTGCCAGCACGTAATGGTGGGAACTCTAAGGAGACTGCCGGTGACAAACCGGAGGAAGGTGGGGACGACGTCAAGTCATCATGGCCCTTACGGCCTGGGCTACACACGTGCTACAATGGCTAGGACAGACGGCTGCAAACCNGCGAGTGGGG 
>CAM_P0000101_READ_00460168 /accession=CAM_P0000101_READ_00460168 /xy=2199_0493 /region=2 /run=R_2008_08_11_16_51_31_ /length=233 /sample_id=1309720343513924875 /sample_acc=CAM_P0000101_SMPL_PAPUT2 /sample_name=CAM_P0000101_SMPL_PAPUT2 /site_id_n=CAM_P0000101_SITE_PAPUT2 
TTTACCGCGGCTGCTGGCACGAAGTTAGCCGGACCTTATTCTTCGGGTACAGTCATTATCTTTCCCGACAAAAGAGCTTTACAACCCAAGGGCCTTCTTCACTCACGCGGCATCGCTGCATCAGGCTTTCGCCCATTGTGCAAGATTCCCCACTGCTGCCTCCCGTAGGAGTCTGGGCCGTATCTCAGTCCCAGTGTGGCTGATCATCCTCTACAAATCAGCTATTGATTACT 

Я хочу, чтобы удалить весь текст после первого >CAM_P* в /sample_name=* и все после sample_name.*

>CAM_* /sample_name=* только должны оставаться эти две вещи.

все это должно быть удалено:

/accession=CAM_P0000101_READ_00457523 /xy=2625_3790 /region=2 /run=R_2008_08_11_16_51_31_ /length=253 /sample_id=1309720343513924875 /sample_acc=CAM_P0000101_SMPL_PAPUT /site_id_n=CAM_P0000101_SITE_PAPUT2 

Может кто-нибудь, пожалуйста, помогите мне?

+1

Каков ваш ожидаемый результат? – anubhava

+0

Обратите внимание на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+1

Почему вы просто не печатаете> CAM_ */sample_name = * "' вместо того, чтобы беспокоиться о любых подстановках? У вас есть 2 строки ввода, но только 1 строка вывода - почему? –

ответ

0

AWK на помощь

awk '{line=""; sep=""; p=q=0; 
     for(i=1;i<=NF;i++) { 
      if(!p && $i~/CAM_P/) { 
       p=1; 
       line=line sep $i; 
       sep=FS 
      } else if(!q && $i~/sample_name/) { 
       q=1; 
       line=line sep $i; 
       sep=FS 
      } 
     } 
     print line 
     }' 

другая альтернатива с grep

grep -o ">CAM_P\w*\|/sample_name=\w*" filename | awk 'ORS=NR%2?FS:RS' 

матч только два слова, и объединить обратно две строки вывода

+0

Спасибо, но я получаю сообщение об ошибке:
awk -f short_name_fasta.awk test
awk: short_name_fasta.awk: 3: awk '{line = ""; Сентябрь = "";
awk: short_name_fasta.awk: 3:^invalid char '' 'в выражении
awk: short_name_fasta.awk: 3: awk' {line = ""; Сентябрь = "";
awk: short_name_fasta.awk: ошибка синтаксиса 3:^ – spamer

+0

У сценария не должно быть 'awk', а также одиночных кавычек. Пожалуйста подтвердите. Включите только то, что находится между отдельными qutoes. Или, ваша копия/вставка, возможно, захватила некоторые недопустимые символы с веб-страницы. – karakfa

+0

Большое спасибо !!! – spamer

0

Как об этом:

sed 's/\(>CAM_P[^ ]*\).*\(\/sample_name=[^ ]*\).*/\1 \2/' filename 
Смежные вопросы