2014-11-05 45 views
0

的test.xmlUnix的:从第一条记录提取时间戳XML文件,它会检查,如果不是会取代第一个记录时间戳

<emp><id>101</id><name>AAA</name><date>06/06/14 1811</date></emp> 
<Join><id>101</id><city>london</city><date>06/06/14 2011</date></join> 
<Join><id>101</id><city>new york</city><date>06/06/14 1811</date></join> 
<Join><id>101</id><city>sydney</city><date>06/06/14 0623</date></join> 
<emp><id>102</id><name>BBB</name><date>09/09/14 2001</date></emp> 
<Join><id>102</id><city>new york</city><date>09/09/14 1410</date></join> 
<Join><id>102</id><city>perth</city><date>09/08/14 2001</date></join> 
<Join><id>102</id><city>tulsa</city><date>09/09/14 1919</date></join> 

时间戳格式:MM/DD/YY HHMM

例如,

为第一行(06/06/14 1811)提取'emp'时间戳并检查'连接'时间戳记行。如果不小于等于另一个时间戳然后从“EMP”时间戳更换成“加入”行

的Output.xml应为,

<emp><id>101</id><name>AAA</name><date>06/06/14 1811</date></emp> 
<Join><id>101</id><city>london</city><date>06/06/14 2011</date></join> 
<Join><id>101</id><city>new york</city><date>06/06/14 1811</date></join> 
<Join><id>101</id><city>sydney</city><date>06/06/14 1811</date></join> 
<emp><id>102</id><name>BBB</name><date>09/09/14 2001</date></emp> 
<Join><id>102</id><city>new york</city><date>09/09/14 2001</date></join> 
<Join><id>102</id><city>perth</city><date>09/09/14 2001</date></join> 
<Join><id>102</id><city>tulsa</city><date>09/09/14 2001</date></join> 

这是例子,我有巨大的xml文件

这是我的代码

for i in `cat test.xml` 
do 
    if [[ "$i" == "<emp>"* ]] ; then 
    empvar=`echo $i | grep -o -P '(?<=<date>).*(?=</date>)' ` 
    empdate=`date --date="$empvar" +%s` 
    echo $i >> ouput.xml 
    else 
    joinvar=`echo $i | grep -o -P '(?<=<date>).*(?=</date>)'` 
    joindate=`date --date="$joinvar" +%s` 
      if [[ $empdate -le $joindate ]]; then 
      echo $i >> output.xml 
      else 
      echo $i | sed 's#<date>\([^<][^<]*\)</date>#<date>'$empvar'</date>#' >> output.xml 
      fi 
    fi 
done 

这段代码工作,它是需要长时间来完成的话,我需要更好的方式来处理

+1

的bash是不适合这个任务。你应该使用'python'等通用语言。 – 2014-11-05 19:23:55

+1

在shell循环中执行这种算术是没有意义的。将脚本移植到Awk/Perl/Python应该会显着提升性能。我的建议是Awk提供简短而友好的学习方式,即Python用于投资回报,但如果您在受欢迎的环境中工作,Perl仍然是一个可行的选择。 – tripleee 2014-11-05 19:27:42

+1

就我个人而言,我喜欢Perl,但是您面临的一个根本性问题是您的XML无效。尝试运行它:http://www.w3schools.com/xml/xml_validator.asp – Sobrique 2014-11-05 19:32:49

回答

0

我用AWK

awk -F '</?date>' ' 
       #{printf("%s \"%s\"\n", substr($0, 1, 2), $2)} 
       /^<emp>/ { ed = $2 
         cd = substr($2, 7, 2) substr($2, 1, 2) substr($2, 4, 2) substr($2, 10) 
         print next } 
       /^<Join>/ { 
         if(cd > (substr($2, 7, 2) substr($2, 1, 2) substr($2, 4, 2) substr($2, 10))) 
         $0 = $1 "<date>" ed "</date>" $3 } 1' test.xml 

感谢您的答复..

相关问题