检查一个文件中的字符串是否存在于unix中的另一个文件中

时间:2014-10-30 05:40:36

标签: unix awk sed grep

我有一个包含版本名称和版本号的文件。第一个文件的内容显示为 -

File1-

<Line contains the name of product1>
package_name0_9_8 >= 1.2.3x-4.5.6
package_name0_9_8-32bit >= 3.6.1g-3.5.1
package_name0_9_8-xx >= 6.3.2v-3.0.4
<Line contains the name of product2>
anotherpackage_name0_9_8 >= 3.5.6u-3.6.5

File2.xml-

<package name="package_name0_9_8" version="1.2.3x-4.4.4"/>
<package name="package_name0_9_8-32bit" version="3.6.1g-3.4.0"/>
.
.

有没有办法用File_name的package_name检查File1中存在的package_name的存在,并检查File1中package_name的相应版本是否与File2的package_name的相应版本相同?

我很坦率地说,我在连接'grep'和'awk'命令以及在这里使用的选项时非常弱。请帮忙。

3 个答案:

答案 0 :(得分:0)

sed -n 's².*²s#<package name="\\(&"/>#\\1 Present#p²;s/ *>= */\\)" *version="/p' File1 > /tmp/File1.sed
sed -n -f /tmp/File1.sed File2
rm /tmp/File1.sed 
  • 没有像awk这样的指令可以做,但做的工作(posix版本--posix在GNU sed上
  • 您可以更改\\1 Present文本的输出消息,其中\\1将成为包名称(几乎没有修改,也可以使用版本)

答案 1 :(得分:0)

看起来你已经有了一个更接近你想要的格式的更短的解决方案。但是,既然我问过Python解决方案是否可行,并且您说是,请查看以下代码:

http://pastebin.com/F5LYrmea

(我没有对它进行多次调试,但它似乎至少比你的示例文件更多。我将代码发布到公共领域.CC-BY-SA不是软件根据CC的制造商的说法,许可证;所以,这就是我没有在这里发布的原因,因为在这里发布它会给它许可。另外,你会在提供的链接上获得特定于Python的语法高亮。)

基本上,这是一个很复杂的文本解析。没有太多的算法来解释。它获取两个文件的内容,剥离包,它们的版本和操作数(将所有这些放在字典中供以后使用),并循环遍历另一个文件的行并比较版本;然后它告诉你哪些匹配,哪些不匹配。

答案 2 :(得分:0)

for a in $(sed -n '/>=/p' File1.txt | grep -o '^[^ ]*'); do for b in $(sed -n "/^$a /{s/.*>=\(.*\)$/\1/p}" File1.txt); do ((! $(grep -c "$a.*$b" File2.txt))) && (echo "$a $b" >> missing_pkgs.txt); done; done;

这是一个快速的衬垫 - 你可以打印出更漂亮的

这种方式的工作方式是嵌套for循环,它将两个部分分成多个变量(你可以通过读取将它们放在一个循环中,如果你愿意的话)然后用grep计算第二个文件中的出现次数计数为零会使测试(())变为true并将缺少的包回显到文件missing_pkgs.txt

这是另一个快速的一个班轮,除了通过读取

加载一个循环和变量更高效之外,它做同样的事情

while read each; do read a b < <(echo $each) && ((! $(grep -c "$a.*$b" File2.txt))) && (echo "$a $b" >> missing_pkgs.txt); done < <(awk '/>=/{ print $1" "$3 }' File1.txt)

更简化:

while read a b; do ((! $(grep -c "$a.*$b" File2.txt))) && (echo "$a $b" >> missing_pkgs.txt); done < <(awk '/>=/{ print $1" "$3 }' File1.txt)