LINUX.ORG.RU

распарсить xml в bash

 , ,


0

3

Есть файл в котором две группы тегов:

<Vars>
<Var id="numberVar" address="number" name="name" dir="in/out..."/>
...
</Vars/
<Events>
<Event id="numberId" VarId="numberVar" .../>
</Events>
Надо что бы посредством bash в блок Event поле VarId попали номера из Var id. Прошу помощи.

Перемещено mono из talks

★★★★★
Ответ на: комментарий от emulek

есть файл коммасепар: содержит описания стр-р:

6890,PROTECTIONS.AVR.Parent,pointer,,,,,5216,414476,4
6891,PROTECTIONS.AVR.Mod,INC,S,,,SHM,,414480,312
6892,PROTECTIONS.AVR.Mod.ctlVal,INT32,,CO,,,,414480,4
6893,PROTECTIONS.AVR.Mod.operTm,TimeStamp,,CO,,,,414484,8
6894,PROTECTIONS.AVR.Mod.origin,Originator,S,CO,,,,414492,260
6895,PROTECTIONS.AVR.Mod.origin.orCat,ENUMERATED,,,,,,414492,4
6896,PROTECTIONS.AVR.Mod.origin.orIdent,INT8U_64,E,,,,,414496,256
6897,PROTECTIONS.AVR.Mod.ctlNum,INT8U,,CO,,,,414752,4
6898,PROTECTIONS.AVR.Mod.stVal,INT32,,ST,dchg,,,414756,4
6899,PROTECTIONS.AVR.Mod.q,Quality,,ST,qchg,,,414760,4
6900,PROTECTIONS.AVR.Mod.t,TimeStamp,,ST,,,,414764,8
6901,PROTECTIONS.AVR.Mod.stSeld,BOOLEAN,,ST,dchg,,,414772,4
6902,PROTECTIONS.AVR.Mod.ctlModel,CtlModels,,RCF,,,,414776,4
6903,PROTECTIONS.AVR.Mod.minVal,INT32,,RCF,,,1,414780,4
6904,PROTECTIONS.AVR.Mod.maxVal,INT32,,RCF,,,5,414784,4
6905,PROTECTIONS.AVR.Mod.stepSize,INT32U,E,RCF,,,1,414788,4
6906,PROTECTIONS.AVR.Beh,INS,S,,,SHM,,414792,16
6907,PROTECTIONS.AVR.Beh.stVal,INT32,,ST,dchg,,,414792,4
6908,PROTECTIONS.AVR.Beh.q,Quality,,ST,qchg,,,414796,4
6909,PROTECTIONS.AVR.Beh.t,TimeStamp,E,ST,,,,414800,8
6910,PROTECTIONS.AVR.Health,INS,S,,,SHM,,414808,16
6911,PROTECTIONS.AVR.Health.stVal,INT32,,ST,dchg,,,414808,4
6912,PROTECTIONS.AVR.Health.q,Quality,,ST,qchg,,,414812,4
6913,PROTECTIONS.AVR.Health.t,TimeStamp,E,ST,,,,414816,8
6914,PROTECTIONS.AVR.SigLen,ASG,S,,,SHM,,414824,56
6915,PROTECTIONS.AVR.SigLen.setMag,AnalogueValue,,SG,,,5000;1000;0,414824,12
6916,PROTECTIONS.AVR.SigLen.units,Unit,S,RCF,,,,414836,8
6917,PROTECTIONS.AVR.SigLen.units.SIunits,ENUMERATED,,,,,5,414836,4
6918,PROTECTIONS.AVR.SigLen.units.multiplier,ENUMERATED,E,,,,0,414840,4
6919,PROTECTIONS.AVR.SigLen.minVal,AnalogueValue,,RCF,,,1000;1000;0,414844,12
6920,PROTECTIONS.AVR.SigLen.maxVal,AnalogueValue,,RCF,,,30000;1000;0,414856,12
6921,PROTECTIONS.AVR.SigLen.stepSize,AnalogueValue,E,RCF,,,1000;1000;0,414868,12
6922,PROTECTIONS.AVR.AVRSt,SPS,S,,,SHM,,414880,16
6923,PROTECTIONS.AVR.AVRSt.stVal,BOOLEAN,,ST,dchg,,,414880,4
6924,PROTECTIONS.AVR.AVRSt.q,Quality,,ST,qchg,,,414884,4
6925,PROTECTIONS.AVR.AVRSt.t,TimeStamp,E,ST,,,,414888,8
6926,PROTECTIONS.AVR.SlaveSt,SPS,S,,,SHM,,414896,16
6927,PROTECTIONS.AVR.SlaveSt.stVal,BOOLEAN,,ST,dchg,,,414896,4
6928,PROTECTIONS.AVR.SlaveSt.q,Quality,,ST,qchg,,,414900,4
6929,PROTECTIONS.AVR.SlaveSt.t,TimeStamp,E,ST,,,,414904,8

Содержит около 10000 строк, я парсю его толька на булевые значения и запихиваю их в xml :

echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $outstream
echo "<HMIConfig05>" >> $outstream
echo "<Vars>" >> $outstream

awk -F "\"*,\"*" '/BOOLEAN/ {print "<Var id=""\042"$1"\042" "\t" "address=""\042"$1"\042" "\t" "type=""\042""$type""\042" "\t" "desc=""\042"$2"\042" "\t" "localDesc=""\042""\042" "\t" "dir=""\042""$dir""\042" "\t" "local=""\042""\042" "\t" "/>" }' file.csv >> $outstream
Далее Добавляем блок Events:
echo "</Vars>" >> $outstream
echo "<Events>" >> $outstream
awk -F "\"*,\"*" '/BOOLEAN/ {print "<Event id=""\042"$1"\042" "\t" "VarId=""\042""$VarId""\042" "\t" "name=""\042"$2"\042" "\t" "localDesc=""\042""\042" "\t" "relay=""\042""false""\042" "\t" "type=""\042""\042" "\t" "/>" }' file.csv >> $outstream
echo "</Events>" >> $outstream
Теперь надо поле VarId, заполнить значениями из Var Id

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

awk -F «\»*,\«*» '/BOOLEAN/ {print «<Var id=»«\042»$1"\042" «\t» «address=»«\042»$1"\042" «\t» «type=»«\042»"$type""\042" «\t» «desc=»«\042»$2"\042" «\t» «localDesc=»«\042»"\042" «\t» «dir=»«\042»"$dir""\042" «\t» «local=»«\042»"\042" «\t» «/>» }' file.csv >> $outstream

да… ППЦ

emulek
()
Ответ на: комментарий от splinter
#!/bin/bash

awk -F "," -v f1=f1.txt -v f2=f2.txt '
/BOOLEAN/{
  printf "<Var "                              >f1
  printf   "id"        "=\""  $1       "\"\t" >f1
  printf   "address"   "=\""  $1       "\"\t" >f1
  printf   "type"      "=\""  "$type"  "\"\t" >f1
  printf   "desc"      "=\""  $2       "\"\t" >f1
  printf   "localDesc" "=\""           "\"\t" >f1
  printf   "dir"       "=\""  "$dir"   "\"\t" >f1
  printf   "local"     "=\""           "\"\t" >f1
  print  "/>"                                 >f1

  printf "<Event "                            >f2
  printf   "id"        "=\""  $1       "\"\t" >f2
  printf   "VarId"     "=\"" "$VarId"  "\"\t" >f2
  printf   "name"      "=\""  $2       "\"\t" >f2
  printf   "localDesc" "=\""           "\"\t" >f2
  printf   "relay"     "=\""  "false"  "\"\t" >f2
  printf   "type"      "=\""           "\"\t" >f2
  print  "/>"                                 >f2
}
'  file.csv

(
  echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
  echo "<HMIConfig05>"
  echo "<Vars>"
  cat f1.txt
  echo "</Vars>"
  echo "<Events>"
  cat f2.txt
  echo "</Events>"
) >1.txt
rm f1.txt f2.txt

и если ничего далее с xml не изменяется, то замени:

  printf   "VarId"     "=\"" "$VarId"  "\"\t" >f2
на:
  printf   "VarId"     "=\"" $1        "\"\t" >f2

anonymous
()
Ответ на: комментарий от anonymous

и дальше:

function item(f, a, b) {
  printf "%s=\"%s\"\t", a, b >f
}
/BOOLEAN/{
  printf "<Var " >f1
  item(f1, "id",        $1)
  item(f1, "address",   $1)
  item(f1, "type",      "$type")
  item(f1, "desc",      $2)
  item(f1, "localDesc")
  item(f1, "dir",       "$dir")
  item(f1, "local")
  print "/>" >f1

  printf "<Event " >f2
  item(f2, "id",        $1)
  item(f2, "VarId",     "$VarId")
  item(f2, "name",      $2)
  item(f2, "localDesc")
  item(f2, "relay",     "false")
  item(f2, "type")
  print "/>" >f2
}

anonymous
()
Ответ на: комментарий от anonymous

спасибо Бро! завтра попробую! от рутины избавляешь.

splinter ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.