使用Bash根据特定属性查找重复的XML数据

使用Bash根据特定属性查找重复的XML数据,xml,bash,duplicates,Xml,Bash,Duplicates,是否可以根据特定的Xml属性提取所有Xml值: 例如,我需要考虑所有具有相同auth_用户名的手机(第一个和最后一个手机具有相同的auth_用户名) <Fund> <mobile> <auth_username>736994</auth_username> <client_name>736994_iPad</client_name> <first_name>Yamelin&

是否可以根据特定的Xml属性提取所有Xml值: 例如,我需要考虑所有具有相同auth_用户名的手机(第一个和最后一个手机具有相同的auth_用户名)

    <Fund>
    <mobile>
    <auth_username>736994</auth_username>
    <client_name>736994_iPad</client_name>
    <first_name>Yamelin</first_name>
    <last_name>test</last_name>
    </mobile>
    <mobile>
    <auth_username>735139</auth_username>
    <client_name>735139_iPad</client_name>
    <first_name>Eunbi</first_name>
    <last_name>Eunbi</last_name>
    </mobile>
    <mobile>
    <auth_username>733279</auth_username>
    <client_name>733279_iPad</client_name>
    <first_name>wang</first_name>
    <last_name>test</last_name>
    </mobile>
    <mobile>
    <auth_username>737618</auth_username>
    <client_name>737618_iPad</client_name>
    <first_name>test</first_name>
    <last_name>testLast</last_name>
    </mobile>
    <mobile>
    <auth_username>736994</auth_username>
    <client_name>734131_iPad</client_name>
    <first_name>Kai</first_name>
    <last_name>test</last_name>
    </mobile>
    </Fund>

736994
736994_iPad
亚梅林
测试
735139
735139_iPad
恩比
恩比
733279
733279_iPad
王
测试
737618
737618_iPad
测试
试片
736994
734131_iPad
凯
测试
所需的输出必须如下所示:

    <Fund>
    <mobile>
    <auth_username>736994</auth_username>
    <client_name>736994_iPad</client_name>
    <first_name>Yamelin</first_name>
    <last_name>test</last_name>
    </mobile>
    <mobile>
    <auth_username>736994</auth_username>
    <client_name>734131_iPad</client_name>
    <first_name>Kai</first_name>
    <last_name>test</last_name>
    </mobile>
    </Fund>

736994
736994_iPad
亚梅林
测试
736994
734131_iPad
凯
测试
我尝试使用xmlstarlet,但我只有auth_用户名作为输出

数据基金=$(xmlstarlet sel-T-T-m“基金/手机”-n-v“auth_username”~/Desktop/DeviceAndUserFund2.csv | sort | uniq-d)


这是另一种方法吗?

Bash特性本身并不非常适合您的XML需求类型。但是,以下是两种解决方案,它们都利用了

解决方案1—使用xmlstarlet:
  • 首先保存以下
    .xsl
    。让我们命名文件
    get dupes.xsl

    获取副本。xsl

    
    
  • 然后通过CLI运行以下xmlstarlet命令:

    xml tr/path/to/get-dupes.xsl/path/to/input.xml
    
    注意:上述命令中的
    /path/to/
    部分应更改为实际文件的实际路径

  • 结果xml将包含所有具有相同
    元素

    xml tr
    命令的一般用法是:

    xmltr[]{-p |-s=}[…]


  • 解决方案2-使用xsltproc: 您还可以通过(已预装在macOS上)实现这一点

    使用名为
    get_dupes.xsl
    (如上所示)的相同XSLT样式表,您可以:

  • 通过运行以下命令从文件中读取源XML:

    xsltproc/path/to/get-dupes.xsl/path/to/input.xml
    
  • 或者,通过管道将源XML传输到
    xsltproc
    。例如:

    cat input.xml | xsltproc/path/to/get-dupes.xsl-
    
    注意,上面使用了尾随连字符(
    -
    )从标准输入读取源xml数据

  • 或者,要将结果XML分配给名为
    DataFund
    的变量,可以执行以下操作:

    DataFund=“$(xsltproc/path/to/get-dupes.xsl/path/to/input.xml)”
    
  • xsltproc没有省略xml声明的选项。为此,您需要将get-dupes.xsl中的
    省略xml声明=“否”
    属性更改为
    省略xml声明=“是”


  • Bash是错误的工具。不要用锤子拧紧。