0

16 進数の 7 列を取得した .txt ファイルがあります。すべての数字は 1 バイトなので、すべての数字は 2 文字で書かれます。最初の 6 列 (16 進数) を合計し、結果の最後の 2 文字 (16 進数) を 7 列目と比較し、同じでない場合は行を削除したかったのです。私はLinuxでbashを使用しているので、仕事をするためにコマンドのパイプが必要になると思います. データのサンプルは次のとおりです。

de 55 7a ff 41 4e 3b
.. .. .. .. .. .. .. .. .. ..

最初の 6 つの数字 (16 進数) の合計は 33b で、「チェックサム」の数字は合計の最後の 2 文字として 3b です。

4

1 に答える 1

1

単一のコマンドですべての比較/チェックを実行できますが、awkきれいではない場合があります。

トリッキーな部分は、deたとえば、あなたが持っている数字を取り、awkそれが文字列/小数ではなく16進数であることを伝えることです. これは、接頭辞を付けて0xから使用することで実現できstrtonum()ます。

数値を「使用可能な数値」に変換した後、最初の 6 列を加算する計算を実行し、結果の部分文字列 (最後の 2 文字) を取得して 7 列目と比較できます。それらが等しい場合は、その行を印刷します。そうでない場合は、無視してください。

awk '{
    x = sprintf("%x",
            strtonum("0x"$1)
            + strtonum("0x"$2)
            + strtonum("0x"$3)
            + strtonum("0x"$4)
            + strtonum("0x"$5)
            + strtonum("0x"$6)
     );

     if (substr(x, length(x) -1, length(x)) == $7) {
         print $0
     };
}' input.txt

(注:sprintf()適切に実行するには、コンテンツを 1 行に収める必要がある場合があります。ここでは、読みやすくするために拡張しました)

これをファイルに出力するに> output.txtは、上記のコマンドの最後に追加できます。これにより、効果的に「削除」されなかったすべての行と一致する行のみが含まれます。

オリジナルを上書きしたい場合は、絶対に必要ない場合を除いて推奨しませんが、追加することができます> output.txt && mv output.txt input.txt(上書きの確認を求めるプロンプトが表示されます)。

于 2013-10-08T14:34:52.703 に答える