Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/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
AWK-如何修改AWK脚本以忽略文件中不包含匹配模式的行?_Awk_Xpath_Shell_Python_Perl_Ruby_Nokogiri_Php_Xmlstarlet - Fatal编程技术网

AWK-如何修改AWK脚本以忽略文件中不包含匹配模式的行?

AWK-如何修改AWK脚本以忽略文件中不包含匹配模式的行?,awk,xpath,shell,python,perl,ruby,nokogiri,php,xmlstarlet,Awk,Xpath,Shell,Python,Perl,Ruby,Nokogiri,Php,Xmlstarlet,我有一个文本文件,其中包含以下格式的数据。这是它包含的数据示例。文件正确且格式正确: <node id="1647008557" lat="36.6536840" lon="-121.7938995" version="1" timestam p="2012-02-25T14:03:54Z" changeset="10787766" uid="294728" user="skew-t"> <tag k="highway" v="turning_circle"/>

我有一个文本文件,其中包含以下格式的数据。这是它包含的数据示例。文件正确且格式正确:

 <node id="1647008557" lat="36.6536840" lon="-121.7938995" version="1" timestam  p="2012-02-25T14:03:54Z" changeset="10787766" uid="294728" user="skew-t">
  <tag k="highway" v="turning_circle"/>
  </node>
  <way id="10459706" version="2" timestamp="2010-03-27T18:21:32Z" changeset="4247030" uid="20587" user="balrog-kun">
    <nd ref="89705976"/>
    <nd ref="89798118"/>
    <nd ref="89798120"/>
    <nd ref="89798122"/>
    <nd ref="89798124"/>
    <nd ref="89798126"/>
    <nd ref="89798128"/>
    <nd ref="89798130"/>
    <tag k="highway" v="residential"/>
    <tag k="name" v="Engineer Road"/>
    <tag k="tiger:cfcc" v="A41"/>
    <tag k="tiger:county" v="Livingston, CA"/>
    <tag k="tiger:name_base" v="Engineer"/>
    <tag k="tiger:name_type" v="Rd"/>
    <tag k="tiger:reviewed" v="no"/>
    <tag k="tiger:separated" v="no"/>
    <tag k="tiger:source" v="tiger_import_dch_v0.6_20070809"/>
    <tag k="tiger:tlid" v="196844016"/>
  </way>
  <way id="10461171" version="3" timestamp="2014-01-07T00:17:59Z" changeset="19855176" uid="1871178" user="RBoggs">
    <nd ref="89804458"/>
    <nd ref="89804460"/>
    <nd ref="89804463"/>
    <nd ref="89804464"/>
    <nd ref="89804466"/>
    <nd ref="89804468"/>
    <tag k="access" v="no"/>
    <tag k="highway" v="residential"/>
    <tag k="motor_vehicle" v="no"/>
    <tag k="name" v="5th Cutoff Street"/>
    <tag k="tiger:cfcc" v="A41"/>
    <tag k="tiger:county" v="Marysville, CA"/>
    <tag k="tiger:name_base" v="5th Cutoff"/>
    <tag k="tiger:name_type" v="St"/>
    <tag k="tiger:reviewed" v="no"/>
    </way>
<way id="151860745" version="1" timestamp="2012-02-25T14:03:59Z" changeset="10787766" uid="294728" user="skew-t">
    <nd ref="1647008614"/>
    <nd ref="1647008545"/>
    <nd ref="1647008605"/>
    <nd ref="1647008555"/>
    <nd ref="1647008557"/>
    <tag k="highway" v="service"/>
  </way>

我如何通过忽略不包含的行来打印输出。不要用awk解析XML/HTML,使用适当的XML/HTML解析器和强大的查询

理论: 根据编译理论,基于的正则表达式不能解析XML/HTML。由于XML/HTML的层次结构,您需要使用一个类似的工具来使用和操作语法

现实生活™ a中的日常工具: 您可以使用以下选项之一:

xpath1通常在默认情况下与libxml2一起安装,并检查是否有以换行符分隔的输出

可以编辑、选择、转换。。。默认情况下未安装,xpath1

通过perl的模块XML::XPath、xpath1安装

xpath3

我自己的项目,包装@Michael Kay的Saxon HE Java库,xpath3

或者您可以使用高级语言和适当的库,我认为: 来自lxml导入etree的

是的

,

多姆XPath

检查:

示例使用: 根据以下情况使用此选项:

文件: 在OP之前,将XML更改为损坏的XML

  <way id="10459706" version="2" timestamp="2010-03-27T18:21:32Z" changeset="424 7030" uid="20587" user="balrog-kun">
    <nd ref="89705976"/>
    <nd ref="89798118"/>
    <nd ref="89798120"/>
    <nd ref="89798122"/>
    <nd ref="89798124"/>
    <nd ref="89798126"/>
    <nd ref="89798128"/>
    <nd ref="89798130"/>
    <tag k="highway" v="residential"/>
    <tag k="name" v="Engineer Road"/>
    <tag k="tiger:cfcc" v="A41"/>
    <tag k="tiger:county" v="Livingston, CA"/>
    <tag k="tiger:name_base" v="Engineer"/>
    <tag k="tiger:name_type" v="Rd"/>
    <tag k="tiger:reviewed" v="no"/>
    <tag k="tiger:separated" v="no"/>
    <tag k="tiger:source" v="tiger_import_dch_v0.6_20070809"/>
    <tag k="tiger:tlid" v="196844016"/>
  </way>

Gilles Quenot已经告诉您使用适当的XML/HTML解析器,他提到Xidel就是其中之一。 我已将您的XML文件保存为“so49592301.XML”

图例作为字符串很简单:

$ ./xidel -s so_49592301.xml -e '"road,way_id,seq_num,node_ref_id"'
接下来选择元素节点,但仅选择那些包含属性为k=name的子节点的节点:

接下来,选择子节点并在索引和ref属性上执行字符串连接,并使用逗号作为分隔符:

$ ./xidel -s so_49592301.xml -e '"road,way_id,seq_num,node_ref_id"' -e '//way[tag[@k="name"]]/nd/join((position(),@ref),",")'
road,way_id,seq_num,node_ref_id
1,89705976
2,89798118
3,89798120
4,89798122
5,89798124
6,89798126
7,89798128
8,89798130
9,89804458
10,89804460
11,89804463
12,89804464
13,89804466
14,89804468
请注意,索引不会从下一个元素节点重新开始?这可以通过放置nd/…轻松解决。。。括号之间:

$ ./xidel -s so_49592301.xml -e '"road,way_id,seq_num,node_ref_id"' -e '//way[tag[@k="name"]]/(nd/join((position(),@ref),","))'
road,way_id,seq_num,node_ref_id
1,89705976
2,89798118
3,89798120
4,89798122
5,89798124
6,89798126
7,89798128
8,89798130
1,89804458
2,89804460
3,89804463
4,89804464
5,89804466
6,89804468
接下来,包括子节点的v属性和元素节点的id属性。但是,您位于子节点内,因此要包含更高级别的内容,必须在../:

为了让它更具可读性:

$ ./xidel -s "so_49592301.xml" \
> -e '"road,way_id,seq_num,node_ref_id"' \
> -e '//way[tag[@k="name"]]/(
>       nd/join(
>         (
>           ../tag[@k="name"]/@v,
>           ../@id,
>           position(),
>           @ref
>         ),
>         ","
>       )
>     )'
road,way_id,seq_num,node_ref_id
Engineer Road,10459706,1,89705976
Engineer Road,10459706,2,89798118
Engineer Road,10459706,3,89798120
Engineer Road,10459706,4,89798122
Engineer Road,10459706,5,89798124
Engineer Road,10459706,6,89798126
Engineer Road,10459706,7,89798128
Engineer Road,10459706,8,89798130
5th Cutoff Street,10461171,1,89804458
5th Cutoff Street,10461171,2,89804460
5th Cutoff Street,10461171,3,89804463
5th Cutoff Street,10461171,4,89804464
5th Cutoff Street,10461171,5,89804466
5th Cutoff Street,10461171,6,89804468

好的,谢谢。但是,有没有一种方法可以使用awk获得相同的输出?awk不是xml解析器的答案。我建议:xmlstarlet sel-t-m'/way/nd'-v'../tag[@k=name]/@v'-o,-v'../@id'-o,,-v'@ref'-nfile.xml | awk-F,-vofs=,'{$3=NR}1'-使用xmlstarlet的-m匹配表达式在nd标记上循环。可能效率较低,因为它每次都必须查找名称和id,但只需对xmlstarlet@Gilles因为我使用的文件是文本文件,所以不能用awk获取输出吗?awk是否有一个函数,我可以用来获取我的文件中节点\u ref\u id出现的位置的编号;DoEcho$title、$id、$++c、$line done可以写得更快、更健壮,因为它不会将转义序列解释为awk-v title=$title-v id=$id-v OFS=',“{print title,id,NR,$0}”,但我假设OP有多个。。。阻止他的真实输入,并询问您如何使用当前的xmlstarlets+后处理方法处理。回答:不要使用awk解析xml,请检查我的答案……现在,由于您的编辑,您的xml已损坏。最好发布一个包含所有“材料”和解释的问题,而不是随着时间的推移扩大帖子/示例输入。人们花时间正确回答你是令人沮丧的。我们不会鼓励你做肮脏的事情。修复您的XML,然后使用真正的XML解析器当XML是以文本文件格式提供给我的确切文件时,我会着手修复它吗?该文件名为file.txt,我只是尝试使用awk从中获取输出,而不是修改它。
$ ./xidel -s so_49592301.xml -e '"road,way_id,seq_num,node_ref_id"' -e '//way[tag[@k="name"]]'
$ ./xidel -s so_49592301.xml -e '"road,way_id,seq_num,node_ref_id"' -e '//way[tag[@k="name"]]/nd/join((position(),@ref),",")'
road,way_id,seq_num,node_ref_id
1,89705976
2,89798118
3,89798120
4,89798122
5,89798124
6,89798126
7,89798128
8,89798130
9,89804458
10,89804460
11,89804463
12,89804464
13,89804466
14,89804468
$ ./xidel -s so_49592301.xml -e '"road,way_id,seq_num,node_ref_id"' -e '//way[tag[@k="name"]]/(nd/join((position(),@ref),","))'
road,way_id,seq_num,node_ref_id
1,89705976
2,89798118
3,89798120
4,89798122
5,89798124
6,89798126
7,89798128
8,89798130
1,89804458
2,89804460
3,89804463
4,89804464
5,89804466
6,89804468
$ ./xidel -s "so_49592301.xml" -e '"road,way_id,seq_num,node_ref_id"' -e '//way[tag[@k="name"]]/(nd/join((../tag[@k="name"]/@v,../@id,position(),@ref),","))'
road,way_id,seq_num,node_ref_id
Engineer Road,10459706,1,89705976
Engineer Road,10459706,2,89798118
Engineer Road,10459706,3,89798120
Engineer Road,10459706,4,89798122
Engineer Road,10459706,5,89798124
Engineer Road,10459706,6,89798126
Engineer Road,10459706,7,89798128
Engineer Road,10459706,8,89798130
5th Cutoff Street,10461171,1,89804458
5th Cutoff Street,10461171,2,89804460
5th Cutoff Street,10461171,3,89804463
5th Cutoff Street,10461171,4,89804464
5th Cutoff Street,10461171,5,89804466
5th Cutoff Street,10461171,6,89804468
$ ./xidel -s "so_49592301.xml" \
> -e '"road,way_id,seq_num,node_ref_id"' \
> -e '//way[tag[@k="name"]]/(
>       nd/join(
>         (
>           ../tag[@k="name"]/@v,
>           ../@id,
>           position(),
>           @ref
>         ),
>         ","
>       )
>     )'
road,way_id,seq_num,node_ref_id
Engineer Road,10459706,1,89705976
Engineer Road,10459706,2,89798118
Engineer Road,10459706,3,89798120
Engineer Road,10459706,4,89798122
Engineer Road,10459706,5,89798124
Engineer Road,10459706,6,89798126
Engineer Road,10459706,7,89798128
Engineer Road,10459706,8,89798130
5th Cutoff Street,10461171,1,89804458
5th Cutoff Street,10461171,2,89804460
5th Cutoff Street,10461171,3,89804463
5th Cutoff Street,10461171,4,89804464
5th Cutoff Street,10461171,5,89804466
5th Cutoff Street,10461171,6,89804468