Как заменить строки, начинающиеся с> на 15 столбцов той же строки, командой awk? - PullRequest
0 голосов
/ 15 февраля 2012

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

 >gi|358482566|ref|NW_003766328.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961607, whole genome shotgun sequence
 TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT
 GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT
 ACTAGATTGTA
 >gi|358482565|ref|NW_003766329.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961609, whole genome shotgun sequence
 TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA
 TTTCCATTAGAGGAAAATAAGGTT 

Я хочу заменить все строки, начинающиеся с >, 15-м столбцом. я не знаю, как заменить строку столбцом, поэтому я пытался заменить все столбцы этой строки 15-м столбцом.

так что я ожидаю получить в качестве вывода:

     >ChrUn_7180000961607
     TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT
     GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT
     ACTAGATTGTA
     >ChrUn_7180000961609
     TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA
     TTTCCATTAGAGGAAAATAAGGTT 

это мои команды:

 awk '{if ($1 ~ />/) for (i=1; i<=19; i++) gsub ($i, $15)}'
 test.fa

когда я использую это, я получаю некоторые изменения в файле, но не то, что я хочу !! колонка 15 убрана !!!

 awk '{if ($1 ~ />/) for (i=1; i<=19; i++) a= $15 gsub($i, a)}'
 gga_ref_Gallus_gallus-4.0_unplaced.fa

и когда я использую это, я получаю эту ошибку!

awk: (FILENAME=gga_ref_Gallus_gallus-4.0_unplaced.fa FNR=1) fatal: sub_common: buf: can't allocate 521711124992 bytes of memory (Cannot allocate memory)

так что мне нужно два заменить * ll строки, которые начинаются с * > на 15-й столбец , и я хочу, чтобы имел > в начале !

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Я думаю, что это будет делать то, что вы хотите:

awk '$0 ~ /^>/ { print ">" $15; next } 1'

Оставит все строки, которые не начинаются с > без изменений.Это достигается с помощью next, чтобы сказать awk, чтобы перейти к следующей записи для случая строк, начинающихся с >.1 есть потому, что оно всегда истинно, поэтому действие по умолчанию для печати строки вызывается для любой строки, которая не начинается с >.

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

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

 sed 's/^\(\s*\)>\(\S*\s*\)\{15\}.*/\1\2/;s/,\s*$//' file
...