ASCII文字を16進コードにマップするawkコマンドは機能しません。

ASCII文字を16進コードにマップするawkコマンドは機能しません。

私はawkを使用しようとしていますが、各ASCII文字を16進コードにマップする小さなプログラムを書くのが素晴らしいアイデアだと思いました。これが私がこれまでにしたことです:

文字列は次のとおりです

abshdfitiggwigiwjirjgiejrigjr

私はそれを単純に保ち、キャリッジリターンやタップなどを含めませんでした。

awkの-Fフラグを使用してフィールドとして識別できるように、これをコンマ区切りのファイルにダンプしました。

a,b,s,h,d,f,i,t,i,g,g,w,i,g,i,w,j,i,r,j,g,i,e,j,r,i,g,j,r,

同じファイルの16進ダンプで同じことをしました。

61,62,73,68,64,66,69,74,69,67,67,77,69,67,69,77,6a,69,72,6a,67,69,65,6a,72,69,67,6a,72,0a,

今、私はすべて同じNFを持っているので、より簡単になると思い、次のawkコマンドを試しました。

awk -F ',' '{for(i=1;i<NF;i++){sum[$i]=$i}} END {for(char in sum) { print char, sum[char]} } ' line.txt linebits.txt 

ここで、line.txt と linebits.txt は正しいファイルに対応します。

出力は次のとおりです。

62 62
h h
72 72
i i
0a 0a
64 64
73 73
j j
w w
65 65
74 74
66 66
67 67
77 77
68 68
a a
69 69
b b
6a 6a
d d
e e
r r
f f
s s
61 61
g g
t t

もちろんこれは意味があります。なぜなら sum[$i]=$i は単に sum[g]=g を実行していて、私が印刷する2つは同じだからです。

この出力が表示される理由はわかりますが、解決策がわかりません。

希望のファイルを指定できますか?標準入力のインデックスを取得できますか?クレイジーな音のように聞こえます。

私が望む出力は次のとおりです。

char - hex code
char - hex code
.....

ベストアンサー1

あなたの目標は、単に他の答えで簡単に取得できるASCIIテーブルを取得するのではなく、awkを学ぶことです。

これには入力ファイルは必要ありません。印刷可能なすべての文字を直接表示できます。

awk 'BEGIN{ for(i=32;i<127;i++) printf("%02x %c\n",i,i) }'

(これを行うと、同じように長い列が1つ生成されます。複数の列が必要な場合は練習のままにしてください。)

OTOH、2行のフィールドのペアを結合したい場合は、文字と16進数だけでなく、任意の値にすることができます。

awk [-Fasneeded] 'NR==1 { for(i=1;i<=NF;i++) save[i]=$i; next }
  { for(i=1;i<=NF;i++) print save[i],$i }' file ...
# linebreak for ease of reading, may be omitted in use

これは、2つの行が2つのファイル(あなたの場合のように)から出てくるか、1つのファイルから出てくるかにかかわらず機能します。行が3つ以上の場合、行1から各後続行までのフィールドはペアになります。このパターンは通常、行 1 にヘッダーがあり、各列の名前が続き、その後に変数の数が続く CSV タイプファイルに適しています。各列にデータがある行。

これは不正行為を含む順序も維持します。詐欺を取り除き、秩序を維持するには:

awk [-Fasneeded] 'NR==1 { for(i=1;i<=NF;i++) save[i]=$i; next } 
  { for(i=1;i<=NF;i++) if(!dupe[$i]++) print save[i],$i ;delete dupe }' file ...
# the delete dupe can be omitted in the two-line case

本当に欲しいなら、これによって生成されたランダムな順序もfor in可能ですが、私には理解できません。一部効果がある数字順やアルファベット順(重複を排除するため)などの順序が意味を持つことがあります。

おすすめ記事