awkを使用して16進数でファイルを印刷する

awkを使用して16進数でファイルを印刷する

ファイル名がありますx

$ cat x
1A34532112345

awk私が書いたスクリプトを使って(Webの助けを借りて)16進数で印刷したいと思います。

fold -1 /home/cscape/Desktop/x | gawk '{ printf("%s , %X\n",$0, int($0) )}' 

ただし、各文字の出力は次のようになります。0

$ fold -1 /home/cscape/Desktop/x | gawk '{ printf("%s , %X\n",$0, int($0) )}'
1 , 1
A , 0
3 , 3
4 , 4
5 , 5
3 , 3
2 , 2
1 , 1
1 , 1
2 , 2
3 , 3
4 , 4
5 , 5

なぜ。でも0。 asのASCII値を印刷したいです。A%dAHEX

答え1

そうでなければ持つawkを使用するには、以下を参照してください。od(「8進ダンプ」):

$ echo 1A34532112345 | od -t x1
0000000 31 41 33 34 35 33 32 31 31 32 33 34 35 0a
0000016

答え2

awk は文字列を数値に自動的に変換します。どの番号ですか?文字列の最初の小数点数字を取って("". の場合のように文字列が空である場合、または小数点数字で始まらない場合にのみ適用可能"A")、これを数値に変換して得られた数字です。""に変換されます0。したがって、これらすべては次のように変換されます0

  • 「0」
  • 「テキスト0個」
  • 「テキスト」
  • 「」

awk は、数値が必要な場合に限り、このように文字列を数値に変換します。では"0text" + 1数字が必要なので結果は です1。 just plainでは"0text"数字が不要なため、変換は行われません。ではprintf("%d", "0text")再度数値が必要なので、文字列は数値に変換されます。

あなたが探しているのは、ordawkの基本以外の機能です。これ愚かな文書awkでこれらの関数を書く方法を説明します。

答え3

これはとても古いですが、Googleの検索結果の上部に表示されるので、もしここで道を見つけるなら...

printf() に渡される値は "A" であり、16 進値でもなく int($0) を使用して変換できる文字列形式でもありません。他の人がすでに指摘したように、型キャストはawkや当時の他の言語ではまったく同じではありません。

    $ awk 'BEGIN{printf("%s, %X, %d\n", "A", "A", "A")}'
    A, 0, 0

ちなみに、Pythonなどの現代言語で必要な構文を使用していない場合でも変わりません。

    >>> int("0xA")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: '0xA'
    
    >>> int("0xA", 16)
    10

しかし、awkには簡単な解決策があります。文字列を16進値に「変換」するには、前に「0x」を追加してから、適切な「%X」でprintfを使用して印刷します。後者はPythonのint()関数にbase = 16を渡すことと変わりません[awkのint()ではサポートされていないトリック]。

    $ awk 'BEGIN{printf("%s, %X, %d\n", "A", "0xA", "0xA")}'
    A, A, 10

はい、出力から0xを削除します。疑わしい場合は、sprintfを使用してintを16進文字列に変換して期待値を再確認し、printfを使用せずに値がどのように印刷されるかを確認してください。 x+1 は「B」を生成します。これは、awkがxを数値として扱い、sprintfが16進数に変換されますが、先行する「0x」を含まないことを証明します。私は、4バイトの値を一度に2バイトずつ作成することがどれほど迷惑なのかということです。

    $ awk 'BEGIN{x=10; y=sprintf("%X", x); print(y)}'
    A
    
    $ awk 'BEGIN{x=10; y=sprintf("%X", x+1); print(y)}'
    B 

さらに、必要に応じていつでも追加できます。

    $ awk 'BEGIN{x=10; y=sprintf("%X", x+1); printf("x = %d, x+1 = 0x%02X, x^3 = 0x%04X\n", x, x+1, x^3)}'
    x = 10, x+1 = 0x0B, x^3 = 0x03E8

もちろんこれはPythonでも動作します。

    >>> print("%04X 0x%04X\n" % (1000, 1000))
    03E8 0x03E8

とにかく、awkに「0x」を追加するのは、Pythonメソッドよりはるかに簡単です。

    >>> hex(int("A", 16))
    '0xa'

元の質問は少し奇妙です。これは、元のファイルにすでに変換する必要がない16進値が含まれているためです。操作が言及されていない間に再フォーマットする必要がある自明なより大きな必要がない限り。

関連情報