Как избавиться от подстрок в определенных строках с помощью bash?

#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