使用awk比较内存和数据内容

时间:2012-09-18 01:17:18

标签: awk gawk

我有两个文件包含第一个字段中的内存和第二个

中包含的数据

文件1:

0x60008798 4567
0x60009912 3457
0x60008814 3111
0x60006590 9116
0x60004942 4443
0x11111111 0000

文件2:

0x60008798 4567
0x60009912 3457
0x60008814 3666
0x60006590 9666
0x60004942 4443
0x22222222 1111

我想检查对于给定的内存值(即第一个字段),两个文件中的数据(即第二个字段)是否匹配。

我试图找出如何使用awk,但解释的案例太复杂了。有人可以帮忙吗?

一种替代方案是我使用grep,或者我可能编写C代码,但我认为我可以使用awk

我的要求:内存应该在任一文件中都有相同的数据......这些内存和数据包含在不同点的内存中,它们应该匹配,如果没有,我会抛出错误。 我自己找到了一个解决方案  awk'BEGIN {while(getline<“file1”){arr [$ 1] = $ 2}} {if(arr [$ 1]!= $ 2){print $ 0}}'file2

谢谢,

特加斯

3 个答案:

答案 0 :(得分:1)

使用0x60008798找到字符串GNU awk

awk '/^0x60008798$/ && FNR==NR { value=$1; data=$2; next } { if ($1 == value) printf ($2==data) ? "MATCH\n" : "NO MATCH\n" }' file1.txt file2.txt

这假定:

  • 两个文件中没有重复的内存值。
  • 你只关心某些东西是否匹配或是否匹配。
  • 即。如果找不到两个匹配值(每个文件一个),则不会生成任何输出。

答案 1 :(得分:1)

请编辑您的帖子以包含您所需的输出。与此同时,这是使用std unix tillty comm的替代解决方案。请man comminfo comm了解详情。

comm -3 <(sort file1) <(sort file2 )
0x11111111 0000
        0x22222222 1111
0x60006590 9116
        0x60006590 9666
0x60008814 3111
        0x60008814 3666
        0x99999999 1234

我们已经按照alpha顺序对这两个文件进行了排序

comm -3过滤第3列输出,即 找到的任何匹配项目。

第一个文件和第二个文件之间的区别是什么,已排序。

修改

要查看哪些值相同,请排除comm输出的前两列:

comm -12 <(sort file1) <(sort file2 )
0x60004942 4443
0x60008798 4567
0x60009912 3457

IHTH

答案 2 :(得分:0)

file1val=$(awk -v addr=$addr '$1 == addr {print $2}' File1)
file2val=$(awk -v addr=$addr '$1 == addr {print $2}' File2)
if [ "$file1val" = "$file2val" ]
then echo match
else echo no match
fi