gpt4 book ai didi

linux - 用于遍历 XML 文件中的 ID 列表并将名称打印/输出到 shell 或输出文件的 BASH 脚本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:08 24 4
gpt4 key购买 nike

我希望遍历与 XML 文件中的 ID 号匹配的 ID 号列表,并使用 BASH(和 AWK)将下面的行打印到 shell 或将其重定向到第三个输出文件(output.txt )

这是分割:

ID_list.txt(此示例的缩写 - 它有 100 个 ID)

4414
4561
2132
999
1231
34
489
3213
7941

XML_example.txt(数千个条目)

<book>
<ID>4414</ID>
<name>Name of first book</name>
</book>
<book>
<ID>4561</ID>
<name>Name of second book</name>
</book>

我希望脚本的输出是第一个文件中 100 个 ID 的名称:

Name of first book
Name of second book
etc

我相信使用带有 for 循环的 BASH 和 AWK 可以做到这一点(对于文件 1 中的每个文件,在文件 2 中找到相应的名称)。我认为您可以递归 GREP 获取 ID 号,然后使用 AWK 打印它下面的行。即使输出看起来像这样,我也可以在以下之后删除 XML 标记:

<name>Name of first book</name>
<name>Name of second book</name>

它在 Linux 服务器上,但我可以将它移植到 Windows 上的 PowerShell。我认为 BASH/GREP 和 AWK 是正确的选择。

有人可以帮我编写脚本吗?

最佳答案

给定一个 ID,您可以使用 XPath xpressions 和 xmllint 命令获取名称,如下所示:

id=4414
name=$(xmllint --xpath "string(//book[ID[text()='$id']]/name)" books.xml)

因此,您可以这样写:

while read id; do
name=$(xmllint --xpath "string(//book[ID[text()='$id']]/name)" books.xml)
echo "$name"
done < id_list.txt

与涉及 awkgrep 和 friend 的解决方案不同,这是使用一个实际的 XML 解析工具。这意味着虽然大多数其他如果遇到以下情况,解决方案可能会中断:

<book><ID>4561</ID><name>Name of second book</name></book>

...这样就可以了。

xmllintlibxml2 包的一部分,并且在大多数情况下都可用分布。

另请注意,最新版本的 awk 具有 native XML parsing

关于linux - 用于遍历 XML 文件中的 ID 列表并将名称打印/输出到 shell 或输出文件的 BASH 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com