2

最初のフィールドにメモリを含み、2 番目のフィールドにデータが含まれる 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

特定のメモリ値 (つまり、最初のフィールド) について、両方のファイルのデータ (つまり、2 番目のフィールド) が一致するかどうかを確認したいと考えています。

同じために awk を使用する方法を見つけようとしていますが、説明されているケースは複雑すぎます。誰でも助けることができますか?

1 つの選択肢は、grep を使用するか、C コードを作成することですが、awk を使用できると思いました。

私の要件: メモリには、どちらのファイルにも同じデータが含まれている必要があります...これらは、メモリと、異なるポイントで取得されたメモリに含まれるデータであり、一致する必要があります。一致しない場合は、エラーがスローされます。私は自分で1つの解決策を見つけました: 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

これは、次のことを前提としています。

  • どちらのファイルにも重複するメモリ値がないことを確認してください。
  • 何かが一致するかどうかだけを厳密に気にします。
  • つまり、2 つの一致する値 (各ファイルから 1 つ) が見つからない場合、出力は生成されません。
于 2012-09-18T02:36:47.897 に答える
1

投稿を編集して、必要な出力を含めてください。それまでの間、std unix untilty を使用した代替ソリューションを次に示しcommます。man commまたは、詳細を確認してくださいinfo comm

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

両方のファイルをアルファベット順に並べ替えました

出力のcomm -33 番目の列をフィルター処理します。これは、見つかった一致する項目です。

残っているのは、ソートされた最初のファイルと 2 番目のファイルの違いです。

編集

commまたは、同じ値を確認するには、出力の最初の 2 列を除外します。

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 に答える