2016-12-26 4 views
1

Я извлекаю интересующий шаблон в файл. В каждой строке я повторяю шаблон, и я хочу заказать все повторяющиеся шаблоны для каждой строки в формате, разделенном запятой. Например: В каждой строке у меня есть строка, как это:Как извлечь все повторяющиеся шаблоны в строке в формате, разделенном запятыми

Line1: InterPro: IPR000504 InterPro: IPR003954 InterPro: IPR012677 Pfam: PF00076 PROSITE: PS50102 SMART: SM00360 SMART: SM00361 EMBL: CP002684 протеомов: UP000006548 GO: GO: 0009507 GO: GO: 0003723 GO: GO: 0000166 Gene3D: 3.30.70.330 SUPFAM: SSF54928 Eggnog: KOG0118 Eggnog: COG0724 InterPro: IPR003954

Line2: InterPro: IPR000306 InterPro: IPR002423 InterPro: IPR002498 Pfam: PF00118 Pfam: PF01363 Pfam: PF01504 PROSITE: PS51455 SMART: SM00064 SMART: SM00330 InterPro: IPR013083 Proteomes: UP000006548 GO: GO: 0005739 GO: GO: 0005524 EMBL: CP002686 GO: GO: 0009555 GO: GO: 0046872 GO: GO: 0005768 GO: GO : 0010008 Gene3D: 3.30.40.10 InterPro: IPR017455

Я хочу, чтобы извлечь все InterPro идентификаторы для каждой линии, вроде как это:

IPR000504, IPR003954, IPR012677, IPR003954

IPR000306, IPR002423, IPR002498, IPR013083, IPR017455

Я использовал этот скрипт:

while read line; do 
    NUM=$(echo $line | grep -oP 'InterPro:\K[^ ]+' | wc -l) 
    if [ $NUM -eq 0 ];then 
     echo "NA" >> InterPro.txt; 
    fi; 
    if [ ! $NUM -eq 0 ];then 
     echo $line | grep -oP 'InterPro:\K[^ ]+' | tr '\n' ',' >> InterPro.txt; 
    fi; 
done <./File.txt 

Проблема заключается в том, что я запускаю этот скрипт, все значения шаблона в файле File.txt печатаются в одной строке. Я хочу, чтобы все значения интересующего шаблона каждой строки печатались в отдельной строке.

Спасибо заранее

ответ

2

С AWK:

awk '{for (i=1; i<=NF; ++i) {if ($i~/^InterPro:/) {gsub(/InterPro:/, "", $i); x=x","$i}} gsub (/^,/, "", x); print x; x=""}' file 

Выходные:

 
IPR000504,IPR003954,IPR012677,IPR003954 
IPR000306,IPR002423,IPR002498,IPR013083,IPR017455 

С отступом и более значимыми именами переменных:

awk ' 
{ 
    for (column=1; column<=NF; ++column) 
    { 
    if ($column~/^InterPro:/) 
    { 
     gsub(/InterPro:/, "", $column) 
     line=line","$column 
    } 
    } 
    gsub (/^,/, "",line) 
    print line 
    line="" 
}' file 

С Баш встроенных команд:

while IFS= read -r line; do 
    for column in $line; do 
    [[ $column =~ ^InterPro:(.*) ]] && new+=",${BASH_REMATCH[1]}" 
    done 
    echo "${new#,*}" 
    unset new 
done < file 
1

Наконец, я изменил сценарий и может получить заинтересованные результаты:

while read line; do 
    NUM=$(echo $line | grep -oP 'InterPro:\K[^ ]+' | wc -l) 
    if [ $NUM -eq 0 ];then 
     echo "NA" >> InterPro.txt; 
    fi; 
    if [ ! $NUM -eq 0 ];then 
     echo $line | grep -oP 'InterPro:\K[^ ]+' | sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}' | sed 's/ /,/g' >> InterPro.txt; 
    fi; 
done <./File.txt