2

我有两个文件,第一个字段包含内存,第二个字段包含数据

文件 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

谢谢,

光辉

4

3 回答 3

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

这假设:

  • 两个文件中都没有重复的内存值。
  • 你只在乎某些东西是否匹配。
  • 即,如果无法找到两个匹配值(每个文件中的一个),则不会生成任何输出。
于 2012-09-18T02:36:47.897 回答
1

please edit your post to inlcude your required output. In the meantime, here is an alternate solution using a std unix untilty comm. Do man comm or info comm to find out more.

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

We've sorted both files so their in alpha order

The the comm -3 filters the 3rd column of output, which are any matched items that are found.

What remains are differences between the first file and then 2nd file, sorted.

edit

OR to see what values are the same, exclude the first 2 columns of comm output:

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

IHTH

于 2012-09-18T02:55:38.730 回答
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
于 2012-09-18T02:12:51.590 回答