我目前正在做一个小项目;在名为 weatherdata.kml 的 kml 文件中,我想提取每个<Placemark>
元素的海平面压力。我正在尝试解析有关海平面压力的信息并将其放入一个名为report.csv
; 并每次在新行上打印海平面压力。
我认为这可以使用awk
,到目前为止我已经尝试过:
awk -F '[>,]' '/minSeaLevelPres/ {print $2}' report.csv
但是当我在 shell 中运行这个命令时,我得到了这个:
1002</minSeaLevelPres
1002</minSeaLevelPres
1002</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1001</minSeaLevelPres
1002</minSeaLevelPres
1002</minSeaLevelPres
1003</minSeaLevelPres
当我想得到这个时:
1002
1002
1002
1001
1001
1001
1001
1001
1001
1001
1001
1002
1002
1003
我不知道如何摆脱</minSeaLevelPres
. 有人能帮忙吗?
下面是一个地标元素的一部分的示例weatherdata.kml
<Placemark>
<styleUrl>#ex</styleUrl>
<lat>19.2</lat>
<lon>-24.1</lon>
<stormName>NINE</stormName>
<stormNum>10</stormNum>
<basin>AL</basin>
<stormType>LO</stormType>
<intensity>20</intensity>
<intensityMPH>23</intensityMPH>
<intensityKPH>37</intensityKPH>
<minSeaLevelPres>1002</minSeaLevelPres>
<atcfdtg>2020082350</atcfdtg>
<dtg>0000 UTC JAN 07</dtg>
</Placemark>
我建议使用可以正确处理 XML 的工具:
输出:
看:
xmlstarlet select --help
KML 是一种 XML 语言。XML 不是一种可以可靠解析的语言
awk
。你可能对你拥有的文件很幸运——它们的结构可能比语言定义所允许的更可靠——但是当你得到一个始终可以使用不同工具的解析器时,根本没有理由在 AWK 中编写你自己的受限解析器。例如,当删除或添加换行符、注释时,您的内容就会中断。我认为您只是在尝试使用错误的工具。就像您已经
awk
在系统上安装一样,您已经安装了例如python
,然后您将拥有一个 XML 解析器,并且可以在没有 Python 标准库之外的外部代码的情况下编写一个非常小的程序来编写您的 CSV。(请记住,UNIX 哲学不是“你有一把锤子,现在一切都是钉子”,而是“你有用于不同目的的工具,为你的目的找到合适的工具”)。就是这样。保存到文件,赋予文件执行权限(
chmod o+x {filename}
),然后就可以运行了/path/to/filename input.kml
。一般说明:
我不知道对您来说什么是“大”,但是如果您最终编写了一个包含数百万行的 CSV,那么您将无法获得非常有效的数据表示。找出这个数据的消费者支持哪些二进制格式,然后直接写出来。有可能有一个 Python 库。
像其他人一样,我不建议这样做,
awk
因为您正在使用 XML。但是,如果您出于某种原因想使用它,并且您的文件被格式化为awk
可以工作或更好的格式,如果它是纯文本文件,那么我只会说明您拥有的命令的确切原因在您的问题中不起作用:您的命令的字段分隔符
>
为,
[>,]
这意味着第二个字段是在您的文件中
>
和包含字符串的行上的这两个字符中的任何一个的第一个实例之后的内容minSeaLevelPres
,{print $2}
它将准确地为您提供您得到的内容:在这种特定情况下,如果您只是想
1002
从您提供的示例文本中获取,您需要的是这个这会将字段分隔符设置为
>
or<
which will make1002
并且只有1002
第三个字段将从上面的命令中打印并给出你想要的:同样,我不建议在
awk
XML 上使用,或者为了参数的缘故,在 HTML 文件上使用,但我只是提供这个答案来说明为什么你的命令不工作以及你会做些什么来让它工作如果您正在对纯文本文件进行操作。以后使用时可以参考这个awk
。使用Raku(以前称为 Perl_6)
上面是用 Raku 编码的答案,Raku 是 Perl 编程语言家族的成员。您可以使用命令行标志在命令行中加载 Raku
XML
模块。然后使用(递归元素搜索)命令-MXML
解析 XML 。lookfor
在最后一步,>>.[0]
或者.map(*.[0])
映射到标签中,只返回其中包含的值。请注意,不清楚您的
weatherdata.kml
文件实际上是什么样子,它是否具有简单、浮动和/或突出的地标中的一个或全部。上面的命令只是递归地查找:TAG<minSeaLevelPres>
,每行输出一个值。示例输入,请参阅:
https://developers.google.com/kml/documentation/KML_Samples.kml
示例输出(更改
TAG
为:TAG<tessellate>
测试):https://github.com/raku-community-modules/XML
https://raku.org/