比较一个文件中的数字,并在它出现在 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
我有两个文件。一个仅包含一列随机整数。 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