awkに16進文字をパイピング

awkに16進文字をパイピング

コマンドは期待どおりに機能します。

$ awk 'BEGIN {print "\x41"}'
A

ただこんな感じ

$ printf '\x41' | awk '{print}'
A

ただし、awkを使用して16進文字を認識すると失敗します。

$ echo '\x41' | awk '{print}'
\x41

この問題を克服する方法は?

ベストアンサー1

次の作業を行う必要があります。

printf '%s\n' '\x41' | 
  awk 'BEGIN{for (i=0;i<0x100;i++) x[sprintf("%02x",i)]=sprintf("%c",i)}
       {print x[tolower(substr($0,3))]}'

awk16進文字列を文字だけでなく数値に直接変換する方法もありません。

このようなことは、で行うのははるかに簡単ですperl。バラよりここawk実装urldecode

〜のように@terdon ヒント、GNU実装には、入力された16進数と8進数を認識するオプションがawkあります。したがって、次のようにすることもできます。-n|--non-decimal-dataawk

printf '%s\n' '\x41' | gawk -n '{printf "%c\n", +("0x" substr($0,3))}'

gawk次の機能もありますstrtonum()

printf '%s\n' '\x41' | gawk -n '{printf "%c\n", strtonum("0x" substr($0,3))}'

おすすめ記事