#awk
Вопрос:
У меня есть файл, который выглядит так
>4RYF_1|Chains A, B, C, D, E, F, G|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MAENTKNENITNILTQKLIDTRTVLIYGEINQELAEDVSKQLLLLESISNDPITIFINSQGGHVEAGDTIHDMIKFIKPTVKVVGTGWVASAGITIYLAAEKENRFSLPNTRYMIHQPAGGVQGQSTEIEIEAKEIIRMRERINRLIAEATGQSYEQISKDTDRNFWLSVNEAKDYGIVNEIIENRDGLKMASWSHPQFEK
>4RYF_2|Chains H, I, J, K, L, M, N|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MNLIPTVIEQTSRGERAYDIYSRLLKDRIIMLGSAIDDNVANSIVSQLLFLDAQDPEKDIFLYINSPGGSISAGMAIYDTMNFVKADVQTIGMGMAASMGSFLLTAGANGKRFALPNAEIMIHQPLGGAQGQATEIEIAARHILKIKERMNTIMAEKTGQPYEVIARDTDRDNFMTAQEAKDYGLIDDIIINKSGLKGHHHHHH
Я хочу избавиться от всех остальных цепочек и вместо этого отобразить это:
>4RYF_1|Chain A|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MAENTKNENITNILTQKLIDTRTVLIYGEINQELAEDVSKQLLLLESISNDPITIFINSQGGHVEAGDTIHDMIKFIKPTVKVVGTGWVASAGITIYLAAEKENRFSLPNTRYMIHQPAGGVQGQSTEIEIEAKEIIRMRERINRLIAEATGQSYEQISKDTDRNFWLSVNEAKDYGIVNEIIENRDGLKMASWSHPQFEK
>4RYF_2|Chain H|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MNLIPTVIEQTSRGERAYDIYSRLLKDRIIMLGSAIDDNVANSIVSQLLFLDAQDPEKDIFLYINSPGGSISAGMAIYDTMNFVKADVQTIGMGMAASMGSFLLTAGANGKRFALPNAEIMIHQPLGGAQGQATEIEIAARHILKIKERMNTIMAEKTGQPYEVIARDTDRDNFMTAQEAKDYGLIDDIIINKSGLKGHHHHHH
В основном меняя цепочки за цепочками и сохраняя только первую букву.
Я пытался сделать что-то подобное, но, очевидно, добавлять трубы в конце строк я не хочу. Как я могу это исправить?
awk -F"|" '{print $1"|"substr($2,1,5)substr($2,7,2)"|"$3"|"$4}' sample
>4RYF_1|Chain A|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MAENTKNENITNILTQKLIDTRTVLIYGEINQELAEDVSKQLLLLESISNDPITIFINSQGGHVEAGDTIHDMIKFIKPTVKVVGTGWVASAGITIYLAAEKENRFSLPNTRYMIHQPAGGVQGQSTEIEIEAKEIIRMRERINRLIAEATGQSYEQISKDTDRNFWLSVNEAKDYGIVNEIIENRDGLKMASWSHPQFEK|||
>4RYF_2|Chain H|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MNLIPTVIEQTSRGERAYDIYSRLLKDRIIMLGSAIDDNVANSIVSQLLFLDAQDPEKDIFLYINSPGGSISAGMAIYDTMNFVKADVQTIGMGMAASMGSFLLTAGANGKRFALPNAEIMIHQPLGGAQGQATEIEIAARHILKIKERMNTIMAEKTGQPYEVIARDTDRDNFMTAQEAKDYGLIDDIIINKSGLKGHHHHHH|||
Ответ №1:
Одна awk
идея:
awk '
BEGIN { FS=OFS="|" } # define input/output field delimiter
/^>/ { # if line starts with ">" then ...
split($2,arr,",") # split field #2 based on comma delimiter; store results in array arr[]
sub("Chains","Chain",arr[1]) # change "Chains" to "Chain" in first array entry
$2=arr[1] # redefine field #2 as first array entry
}
1 # print current line
' gene.dat
# or as a one-liner:
awk 'BEGIN {FS=OFS="|"} /^>/ {split($2,arr,",");sub("Chains","Chain",arr[1]);$2=arr[1]} 1' gene.dat
Оба генерируют:
>4RYF_1|Chain A|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MAENTKNENITNILTQKLIDTRTVLIYGEINQELAEDVSKQLLLLESISNDPITIFINSQGGHVEAGDTIHDMIKFIKPTVKVVGTGWVASAGITIYLAAEKENRFSLPNTRYMIHQPAGGVQGQSTEIEIEAKEIIRMRERINRLIAEATGQSYEQISKDTDRNFWLSVNEAKDYGIVNEIIENRDGLKMASWSHPQFEK
>4RYF_2|Chain H|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MNLIPTVIEQTSRGERAYDIYSRLLKDRIIMLGSAIDDNVANSIVSQLLFLDAQDPEKDIFLYINSPGGSISAGMAIYDTMNFVKADVQTIGMGMAASMGSFLLTAGANGKRFALPNAEIMIHQPLGGAQGQATEIEIAARHILKIKERMNTIMAEKTGQPYEVIARDTDRDNFMTAQEAKDYGLIDDIIINKSGLKGHHHHHH
Ответ №2:
Простая замена в отдельных строках, подобная этой, — это действительно та работа, в которой sed лучше всего справляется:
$ sed 's/Chains( .)[^|]*/Chain1/' file
>4RYF_1|Chain A|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MAENTKNENITNILTQKLIDTRTVLIYGEINQELAEDVSKQLLLLESISNDPITIFINSQGGHVEAGDTIHDMIKFIKPTVKVVGTGWVASAGITIYLAAEKENRFSLPNTRYMIHQPAGGVQGQSTEIEIEAKEIIRMRERINRLIAEATGQSYEQISKDTDRNFWLSVNEAKDYGIVNEIIENRDGLKMASWSHPQFEK
>4RYF_2|Chain H|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MNLIPTVIEQTSRGERAYDIYSRLLKDRIIMLGSAIDDNVANSIVSQLLFLDAQDPEKDIFLYINSPGGSISAGMAIYDTMNFVKADVQTIGMGMAASMGSFLLTAGANGKRFALPNAEIMIHQPLGGAQGQATEIEIAARHILKIKERMNTIMAEKTGQPYEVIARDTDRDNFMTAQEAKDYGLIDDIIINKSGLKGHHHHHH
но если вы предпочитаете использовать awk, то используйте GNU awk для gensub()
:
$ awk '{print gensub(/Chains( .)[^|]*/,"Chain\1",1)}' file
>4RYF_1|Chain A|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MAENTKNENITNILTQKLIDTRTVLIYGEINQELAEDVSKQLLLLESISNDPITIFINSQGGHVEAGDTIHDMIKFIKPTVKVVGTGWVASAGITIYLAAEKENRFSLPNTRYMIHQPAGGVQGQSTEIEIEAKEIIRMRERINRLIAEATGQSYEQISKDTDRNFWLSVNEAKDYGIVNEIIENRDGLKMASWSHPQFEK
>4RYF_2|Chain H|ATP-dependent Clp protease proteolytic subunit|Listeria monocytogenes (1639)
MNLIPTVIEQTSRGERAYDIYSRLLKDRIIMLGSAIDDNVANSIVSQLLFLDAQDPEKDIFLYINSPGGSISAGMAIYDTMNFVKADVQTIGMGMAASMGSFLLTAGANGKRFALPNAEIMIHQPLGGAQGQATEIEIAARHILKIKERMNTIMAEKTGQPYEVIARDTDRDNFMTAQEAKDYGLIDDIIINKSGLKGHHHHHH