Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix:从xml文件中的第一条记录中提取时间戳,并检查它是否会替换第一条记录的时间戳_Xml_Date_Unix_Awk_Grep - Fatal编程技术网

Unix:从xml文件中的第一条记录中提取时间戳,并检查它是否会替换第一条记录的时间戳

Unix:从xml文件中的第一条记录中提取时间戳,并检查它是否会替换第一条记录的时间戳,xml,date,unix,awk,grep,Xml,Date,Unix,Awk,Grep,我有test.xml 时间戳格式:MM/DD/YY HHMM 比如说, 提取第一行06/06/14 1811的“emp”时间戳,并检查“加入”时间戳行。如果不小于另一个时间戳,则将“emp”时间戳替换为“join”行 我的output.xml应该是 <emp><id>101</id><name>AAA</name><date>06/06/14 1811</date></emp> <Join

我有test.xml

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

比如说,

提取第一行06/06/14 1811的“emp”时间戳,并检查“加入”时间戳行。如果不小于另一个时间戳,则将“emp”时间戳替换为“join”行

我的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 
这段代码正在运行,需要很长时间才能完成,因此,我需要更好的方法来处理我使用的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

感谢您的回复。

bash不适合此任务。您应该使用像python这样的通用语言,在shell循环中执行这种算法毫无意义。将脚本移植到Awk/Perl/Python应该会带来显著的性能提升。我的建议是,使用Awk进行简短友好的学习,使用Python进行投资回报,但如果您在流行Perl的环境中工作,使用Perl仍然是一个可行的选择。我个人喜欢Perl,但您面临的一个根本问题是XML无效。尝试通过以下方式运行它:
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