Awk

使用 Shell 從 KML 中提取海平面壓力

  • March 15, 2022

我目前正在做一個小項目;在名為 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 --template --value-of '//minSeaLevelPres' -n weatherdata.kml

輸出:

1002

看:xmlstarlet select --help

KML 是一種 XML 語言。XML 不是一種可以可靠解析的語言awk。你可能對你擁有的文件很幸運——它們的結構可能比語言定義所允許的更可靠——但是當你得到一個始終可以使用不同工具的解析器時,根本沒有理由在 AWK 中編寫你自己的受限解析器。例如,當刪除或添加換行符、註釋時,您的內容就會中斷。

我認為您只是在嘗試使用錯誤的工具。就像您awk在系統上安裝一樣,您已經安裝了例如python,然後您將擁有一個 XML 解析器,並且可以在沒有 Python 標準庫之外的外部程式碼的情況下編寫一個非常小的程序來編寫您的 CSV。(請記住,UNIX 哲學不是“你有一把錘子,現在一切都是釘子”,而是“你有用於不同目的的工具,為你的目的找到合適的工具”)。

import sys
import xml.etree.ElementTree as ElemTree

fname = sys.argv[1]
tree = ElemTree.parse(fname)
for placemark in tree.getroot().iter("Placemark"):
   print(placemark.find("minSeaLevelPres").text)

就是這樣。保存到文件,賦予文件執行權限(chmod o+x {filename}),然後就可以執行了/path/to/filename input.kml

一般說明:

因為weatherdata.kml是這麼大的文件,

我不知道對您來說什麼是“大”,但是如果您最終編寫了一個包含數百萬行的 CSV,那麼您將無法獲得非常有效的數據表示。找出這個數據的消費者支持哪些二進制格式,然後直接寫出來。有可能有一個 Python 庫。

引用自:https://unix.stackexchange.com/questions/694397