2016-03-10 3 views
0

Я застрял в этой задаче. У меня есть список вроде этого:Возвратите только последовательность строк с конкретными узорами

(...) 
distName="PLMN-PLMN/MRBTS-4130/LNBTS-4130/FTM-1/IPNO-1"  
"btsId">4130< 
IpAddress">10.52.71.38</p> 
(...) 

И я делаю окончательный файл так:

MRBTS-4130,4130,10.52.71.38 

Но иногда некоторые части отсутствуют, и файл выглядит следующим образом:

distName="PLMN-PLMN/MRBTS-4130/LNBTS-4130/FTM-1/IPNO-1"  
"btsId">4130< 
distName="PLMN-PLMN/MRBTS-4132/LNBTS-4132/FTM-1/IPNO-1" 
"btsId">4132< 
IpAddress">10.52.71.38</p> 
distName="PLMN-PLMN/MRBTS-4135/LNBTS-4135/FTM-1/IPNO-1" 
"btsId">4135< 
distName="PLMN-PLMN/MRBTS-4138/LNBTS-4138/FTM-1/IPNO-1" 

И в мой последний файл Я хотел бы иметь только такие строки:

MRBTS-4132,4132,10.52.71.38 

Так что я хотел бы искать только линии, где у меня есть такие пары:

  • первая линия имеет DISTNAME
  • вторая линия имеет btsId
  • третья линия Ipaddress

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

  • first distName
  • второго btsId
  • третий DISTNAME снова

будет просто отвергнут.

У меня в настоящее время такой код:

grep -E "MRBTS|btsId|IpAddress" topology.xml > temp_list 

id_list=(`grep -E "btsId" temp_list | grep -o '[0-9]*'`) 

ip_list=(`grep -E "IpAddress" temp_list | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"`) 

id_size=${#id_list[*]} 

for ((e=0; e<$id_size; e++ )) 

do 
    echo "MRBTS-${id_list[e]};${ip_list[e]}" >> id_list 

done 

Но как вы можете видеть это принимать некоторые недостающие последовательности строк, и я хотел бы избежать такого сценария.

+0

Я голосовал, чтобы закрыть этот вопрос как не относящийся к теме, потому что StackOverflow не является службой написания кода. Что вы пробовали? – cadrian

+0

В настоящее время я делаю это: –

+0

покажите нам свои усилия, и мы можем вам помочь. –

ответ

0

В конце концов это было намного проще в использовании Python для этого решения с библиотекой ElementTree. Код

from xml.etree import ElementTree 
import os 

HOME = os.environ['HOME'] 

with open(HOME+'/TF/topo/topo.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 

for node in tree.findall('.//{raml20.xsd}managedObject'): 
    btsId=None 
    Ip=None 
    for p in node.findall('{raml20.xsd}p'): 
     if p.attrib.get('name')=='btsId': 
      btsId=p.text 
     elif p.attrib.get('name')=='IpAddress': 
      Ip=p.text 
    if btsId and Ip: 
     print "MRBTS-"+btsId+";"+Ip 
0

С простака:

awk -v RS='distName=' -F "[<>/]" 'NR!=1{print $2","$7","$10}' file.txt 
+1

Вы должны упомянуть о том, что Gawk-специфичен из-за многосимвольного RS. –

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