2014-08-05 2 views
1

У меня есть табуляция файл TAHT выглядит следующим образом:Extract несколько полей, которые содержат определенные слова

locus_tag="PSE_0001" codon_start=1 transl_table=11  product="Peptidase M23 M37 family protein" protein_id="AEV34513.1" db_xref="GI:359341139" translation="MVDSLASSSDQPARLNGRWLIGTILTGMTSMVLMGGALMAALDGQYTYKTAKAPASNAADLTPQRNTSGKGDRLTSATDGFSNRQIIEVNTVTRSEGRDHVKAKPYALVSASLESFKKQETAADIPPFDPITMYQGEQVAPLQVASDAIYGADIEGEVSISQRDFPLEAMSMVALPDHKEEAVQQQVKKAAMFMLDNSTDIAAIPSVEDINAGFAPLSEQSFENIEVRITEENVSFQPKSRKTTQANQIEERIVPILTQTDFIDILLDGEASETEAEGYIKAFTDNFGIDTIKAGQIFRLSLNTDQIEEDDGILVRVSIYEDQRHVGTIARNDEGEFVVAPEPTTQMAADAFNSQQQNSVGPRATYYDSIYQTGLDNEVPSSLIKELIRIYSYSVDFNASVKSGDEMSVFYGLDADQTTGASEILYTSITVNGRSHRFYRFRTPDDGVVDYYDENGQSAKQFLLRKPIAAGRFTSGFGMRRHPVLKTRRLHTGTDWAAPRGTAIFAAGDGVIQKAAWSGGYGKRVEIKHANGYVTTYNHMTRFATGIQKGQRIRQGTVIGYVGTTGLSTGNHLHYEVKVNGRFVNSLKIKVPQGRVLEAQVLENFKRERDRINALMETGRPSQRVASLRN" GenBank_acc="CP003147";  Source="Pseudovibrio sp. FO-BEG1"; feature_type="CDS";  strand="+"; 
locus_tag="PSE_0002" codon_start=1 transl_table=11 product="hypothetical protein" protein_id="AEV34514.1" db_xref="GI:359341140" translation="MENVLIYLVGFAGTGKLTIARALAEATSAKVVDNQWINNPIFGLLDHDRLTPYPEGVWRQIDKVREAVLETVATLGAPHASYIFTHEGFEDDASDRQIYEAIRETAQRRKARFLPVRLLCNEDEIAKRVVSPERALRLKSMDPERSRNAVRNSTVLKPNHENELTLDISDKQPADVVVLILEQVAHCKT"  GenBank_acc="CP003147";  Source="Pseudovibrio sp. FO-BEG1"; feature_type="CDS";  strand="-"; 

Я хотел бы извлечь только те поля, которые содержат конкретную информацию:

например

locus_tag 
product 

Чтобы получить следующие вкладки разделителями результата

locus_tag="PSE_0001" product="Peptidase M23 M37 family protein" 
locus_tag="PSE_0002" product="hypothetical protein" 

Я попробовал этот AWK код:

awk '{for(i=1;i<=NF;i++)if ($i~/^locus_tag|^product|db_xref/) print $i}' Chrom.txt| head 

Но я получил:

locus_tag="PSE_0001" 
codon_start=1 
transl_table=11 
product="Peptidase 
M23 
M37 
family 
protein" 
db_xref="GI:359341139" 

Любое предложение, как я могу исправить мой код?

+0

'grep -Po '(? <= Product =") [^ "] *' file' также предоставит данные. – fedorqui

ответ

2

В вашем коде, вы на самом деле не делать то, что вы просили:

awk '{for(i=1;i<=NF;i++)if $1~/^locus_tag|^product|db_xref/) print $i}' Chrom.txt 

вы не просили dbref, например, и есть недостающая скобка после того, как если. Также, если ваш файл разделен на вкладку, вы должны добавить -F"\t". Кроме того, он разбивает строки, потому что печать прерывает строки после каждого вызова. Поэтому вы хотите использовать printf, которые не добавляют «\ n» автоматически.

Вот как я хотел бы сделать:

awk -F"\t" '{for (i=1;i<=NF;i++) {if($i~/locus_tag/) printf $i"\t"; if($i~/product/) printf $i"\n"}}' file 

Поскольку локус тег появится первым, я печатаю поле и вкладку, и когда я найти продукт, я печатаю поле и разорвать линию

Edit:

Если у вас есть более 2 полей для извлечения, здесь с 3, вы можете хранить их в массиве:

awk -F"\t" 'BEGIN{j=1} 
{for (i=1;i<=NF;i++) if($i~/locus_tag|product|db_xref/) {a[j]=$i;j=j+1}} 
END{for (i=1;i<=length(a);i=i+3) print a[i],a[i+1],a[i+2]}' file 

locus_tag="PSE_0001" product="Peptidase M23 M37 family protein" db_xref="GI:359341139" 
locus_tag="PSE_0002" product="hypothetical protein" db_xref="GI:359341140" 
+0

tahnk you !! Извините, что отсутствующая скобка была типичной копией кода. Ваш скрипт работает отлично. Поэтому в основном я рассматриваю каждое слово, которое я хочу искать как новое условие. – efrem

Смежные вопросы