比较一个文件中的数字,并在它出现在 shell 脚本中的字符串中时将其匹配到文件中

Comparing a number from one file and match it in in a file when it comes inside a string in shell script

我有两个文件。一个仅包含一列随机整数。 1.dat :

    2
    4
    7
    9

其他文件 (2.dat) 包含以下内容:

    <event id="2">
    <rwgt>
    <wgt id="1">0.866665</wgt>
    <wgt id="2">0.866665</wgt>
    <event id="3">
    <rwgt>
    <wgt id="1">0.901111</wgt>
    <wgt id="2">0.901111</wgt>
    ....

我想比较1.dat的每个数字和里面的数字

    <event id=" "> tag

并且在匹配时我想要

中的数字
    <wgt id="1"> </wgt> tag

我在 shell 脚本中使用第一个文件

    #! /bin/bash
    while read first ; 
    do
    echo "$first"
    done < 1.dat

但是在 do 循环中我仍然无法合并 2.dat 文件。 谁能帮帮忙

这是您要找的吗:

#!/bin/bash

while read first
do
        if grep "<event id=\"$first\">" 2.dat
        then grep -A 2 "<event id=\"$first\">" 2.dat | tail -1 | sed 's/\(<wgt id=...>\|<\/wgt>\)//g'  >>output.dat
        fi
done < 1.dat

exit

这会将预期的行输出到 ./output.dat

为了扩展我上面的评论,如果你的真实文件有效 XML,像这样:

<?xml version="1.0"?>
<root>
  <event id="2">
    <rwgt>
      <wgt id="1">0.866665</wgt>
      <wgt id="2">0.866665</wgt>
    </rwgt>
  </event>
  <event id="3">
    <rwgt>
      <wgt id="1">0.901111</wgt>
      <wgt id="2">0.901111</wgt>
    </rwgt>
  </event>
</root>

然后您可以使用 XML 解析器,例如 xmllint 来提取您感兴趣的值:

#!/bin/bash

while read id; do
    val=$(xmllint --xpath "//event[@id='$id']//wgt[@id=1]/text()" 2.dat 2>/dev/null)
    [[ -n $val ]] && echo "$val"
done < 1.dat

这里我使用了一个 xpath 表达式来获取带有 id=1<wgt> 元素的文本内容,在带有匹配 id<event> 元素中文件中的值。如果没有匹配项,则会向 stderr 打印一条消息,因此我已将其重定向到 /dev/null 以抑制它。

输出:

0.866665