2016-08-23 2 views
0

У меня есть длинный список данных, организованный, как показано ниже (INPUT). Я хочу разбить данные так, чтобы получить выходной сигнал, как показано ниже (желаемый ВЫХОД).unix split FASTA с использованием цикла, awk и split

В приведенном ниже коде определены все строки, содержащие «> gi», и сохраняется линейная строка этих строк в массиве B. Затем в новом файле он должен заменить эти строки из массива B на сокращенную версию текста, следующего за «> gi»

Я понял, что самым простым способом было бы разделение на «|», однако это не сработает (без моего разделения с моим кодом, если я заменяю «» на «|»)

Мой код ниже и хорошо делится после «", если я заменил "|" на «» в ВХОДА, однако я попадаю в неприятности, когда я хочу, чтобы получить текст между [] скобки, что не всегда и не всегда только два слова ...:

B=$(grep -n ">gi" 1VAO_1DII_5fxe_all_hits_combined.txt | cut -d : -f 1) 

awk <1VAO_1DII_5fxe_all_hits_combined.txt >seqIDs_1VAO_1DII_5fxe_all_hits_combined.txt -v lines="$B" ' 
BEGIN {split(lines, a, " "); for (i in a) change[a[i]]=1} 
NR in change {$0 = ">" $4} 
1 
' 

дайте мне знать если требуется больше объяснений!

ВХОД:

>gi|9955361|pdb|1E0Y|A:1-560 Chain A, Structure Of The D170sT457E DOUBLE MUTANT OF VANILLYL- Alcohol Oxidase 
MSKTQEFRPLTLPPKLSLSDFNEFIQDIIRIVGSENVEVISSKDQIVDGSYMKPTHTHDPHHVMDQDYFLASAIVA 

>gi|557721169|dbj|GAD99964.1|:1-560 hypothetical protein NECHADRAFT_63237 [Byssochlamys spectabilis No. 5] 
MSETMEFRPMVLPPNLLLSEFNGFIRETIRLVGCENVEVISSKDQIHDGSYMDPRHTHDPHHIMEQDYFLASAIVAPRNV 

требуемый выход:

>1E0Y 
MSKTQEFRPLTLPPKLSLSDFNEFIQDIIRIVGSENVEVISSKDQIVDGSYMKPTHTHDPHHVMDQDYFLASAIVAPRNV 

>GAD99964.1 Byssochlamys spectabilis No. 5 
MSETMEFRPMVLPPNLLLSEFNGFIRETIRLVGCENVEVISSKDQIHDGSYMDPRHTHDPHHIMEQDYFLASAIVA 
+2

Это слишком сложно для не-навязчивого читателя, чтобы попытаться разобрать. Разве вы не можете сделать набор символов на 20 символов, который позволит людям легко увидеть проблему и помочь вам решить проблему? Кроме того, я думаю, что показ ввода, а затем вывод для более естественного потока решения проблем. Удачи. – shellter

+0

спасибо за предложения, было сделано редактирование – gugy

+1

[изменить] ваш вопрос снова и использовать кнопку '{}' для форматирования ввода и вывода так же, как вы сделали свой код. –

ответ

2

Это может быть сделано в одном шаге с AWK (ГНУ AWK):

awk -F'|' '/^>gi/{a=1;match($NF,/\[([^]]*)]/, b);print ">"$4" "b[1];next}a{print}!$0{a=0}' input > output 

В более читаемым образом:

/^>gi/ { # when the line starts with ">gi" 
    a=1; # set flag "a" to 1 
    # extract the eventual part between brackets in the last field 
    match($NF,"\\[([^]]*)]", b); 
    print ">"$4" "b[1]; # display the line 
    next # jump to the next record 
} 

a { print } # when "a" (allowed block) display the line 

!$0 { a=0 } # when the line is empty, set "a" to 0 to stop the display 
+0

это дает мне только символ>, за которым следует пустая строка. Мне нужна строка> 4-й элемент между «|» и бит между [] скобками. Я не понимаю, что происходит в строке match(). – gugy

+0

Хорошо. теперь ясно, что происходит с матчем. может ли команда печати быть изменена, чтобы не просто напечатать 4-й элемент строки, а фактически 4-й элемент строки, используя разделитель «|»? – gugy

+0

Ничего, проигнорируйте предыдущий комментарий ... Я был смущен мной. Он работает плавниками. Thx – gugy

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