awk双引号字段9月

2024-05-18 18:37:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我似乎想不出我最后一个作品来达到我想要的效果。

我有一个包含许多条目的文件,如下所示:

<Stats>
    <RecNum>45435</RecNum>
    <Date>2016/12/31</Date>
    <DayofWeek>6</DayofWeek>
    <Time>16:35</Time>
    <Dir>Closing</Dir>
    <Class>2</Class>
    <SpeedSpan>1</SpeedSpan>
    <TimeSpan>1</TimeSpan>
    <Bucket Speed="34" Count="1"/>
    <Bucket Speed="35" Count="0"/>
    <Bucket Speed="36" Count="1"/>
</Stats>

如果Count=1,我想打印日期、时间和速度,如下所示:

^{pr2}$

我最接近的是:

$ awk -F'[ <>]' 'BEGIN {d="d";t="t";} /<Date>/ {d=$3;} /<Time>/ {t=$3;} /Count="1"/ {print d "\t" t "\t" $3;}' speed.xml

这给了我:

2016/12/31  16:35   Speed="34"
2016/12/31  16:35   Speed="36"

我试过很多不同的迭代,但似乎不能得到没有文字的速度数字。我试图用“作为字段分隔符,但它似乎从来没有像预期的那样工作。

我希望找到一个awk解决方案,但如果没有,我可以使用python程序来去除不需要的字符。


Tags: datebuckettimestatscountdir作品速度
3条回答

Jose Ricardo Bustos M.'s helpful XSLT-based answer和{a2}更可取,因为它们采用了适当的XML解析,这两种解析既灵活又健壮。在

要修复awk命令:

awk -v OFS='\t' -F'[<>]' '
  /<Date>/ {d=$3}
  /<Time>/ {t=$3} 
  /Count="1"/ {
    split($0, flds, "\"")
    print d, t, flds[2]
  }
' speed.xml

split($2, flds, "\"")"拆分感兴趣的行,并将结果存储到自定义数组flds,这允许按索引2提取{}属性值。在

还要注意-v OFS='\t'的用法,也就是说,将输出字段分隔符设置为制表符,这将启用一个更简单的print语句,该语句枚举(,)输出字段,并依赖awkOFS隐式分隔它们。在


事后想想:在字段分隔符字符集中添加"也会起作用:

^{pr2}$

既然你提到了python:

import xml.dom.minidom

# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parseString('<X>' + my_xml + '</X>')
collection = DOMTree.documentElement
for record in collection.getElementsByTagName("Stats"):
    date = record.getElementsByTagName('Date')[0].childNodes[0].data
    time = record.getElementsByTagName('Time')[0].childNodes[0].data
    buckets = record.getElementsByTagName('Bucket')
    for bucket in buckets:
        x = bucket.getAttribute('Count')
        if int(bucket.getAttribute('Count')) != 0:
            print('%s\t%s\t%s' % (date, time, bucket.getAttribute('Speed')))

使用的数据:

^{pr2}$

印刷品:

2016/12/31  16:35   34
2016/12/31  16:35   36

尽管我喜欢awk,但我建议使用xslt来实现这一点(使用XSLT,可以将XML文档转换为任何文本格式)。xslt w3schools

file.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="Stats/Bucket[@Count='1']">
            <xsl:value-of select="../Date"/>
            <xsl:text>&#x9;</xsl:text>
            <xsl:value-of select="../Time"/>
            <xsl:text>&#x9;</xsl:text>
            <xsl:value-of select="@Speed" />
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

跑吧。如果您使用的是某种Linux/Unix,请使用XSLT-1.0处理器xsltproc(还有更多处理器),如下所示:

^{pr2}$

你得到了

2016/12/31  16:35   34
2016/12/31  16:35   36

相关问题 更多 >

    热门问题