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 를 수행하고 있고 내가 인쇄하는 두 개는 동일하기 때문입니다.

이 출력이 표시되는 이유는 알지만 해결 방법을 모르겠습니다.

원하는 파일을 지정할 수 있나요? 표준 입력의 색인을 얻을 수 있습니까? 미친 소리처럼 들리는 거 알아요 하하

내가 원하는 출력은 다음과 같습니다.

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

답변1

귀하의 목표는 단순히 다른 답변으로 쉽게 얻을 수 있는 ASCII 테이블을 얻는 것이 아니라 awk를 배우는 것 같습니다.

이를 위해서는 입력 파일이 필요하지 않습니다. 인쇄 가능한 모든 문자를 직접 표시할 수 있습니다.

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

(이렇게 하면 시도와 마찬가지로 하나의 긴 열이 생성됩니다. 여러 열을 원할 경우 연습으로 남겨두세요.)

OTOH, 두 행의 필드 쌍을 결합하려는 경우 문자와 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

이는 두 줄이 두 파일(귀하의 경우와 같이)에서 나오든 하나의 파일에서 나오든 작동합니다. 행이 세 개 이상인 경우 행 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가능하지만 나에게는 이해가 되지 않습니다. 일부효과가있다숫자 순서나 알파벳 순서(중복을 제거하기 위해)와 같은 순서가 의미가 있을 수 있습니다.

답변2

더 쉬운 방법이 있지만 여기서 목표는 awk를 배우는 것 같으므로 설명하는 방법을 사용하여 수행하는 방법은 다음과 같습니다. 우선, 저는 ,분리를 사용하지 않을 것입니다. 유사한 작업을 수행하기 위해 선을 사용하는 것이 더 쉬울 것입니다. 그런 다음 NR및 특수 변수를 사용하여 FNR두 파일을 연결할 수 있습니다 . NR현재 입력 라인 번호를 저장하고, FNR입력 라인 번호를 저장합니다.현재 읽고 있는 파일의. 따라서 awk각각 2줄로 구성된 두 개의 파일이 주어지면 파일은 NRfrom 으로 이동 1하지만 4두 번째 파일의 첫 번째 줄을 읽을 때는 FNRfrom 으로 이동한 다음 다시 로 이동 1합니다 2.12

그것들을 합치면 다음과 같이 할 수 있습니다:

## get the characters, one per line
printf '%s\n' {a..z} > chars

## get the 2byte codes as you had in the question. I am sure
## there is a simpler way, but this is the best I could come up with
hexdump -x chars | tr -s ' ' '\n' | sed -n 's/^0a//p' > codes

이 파일을 사용하여 다음을 수행할 수 있습니다.

## Use awk to print them in pairs
$ awk '{ if(NR==FNR){chars[FNR]=$1} else{ print chars[FNR],$1}}' chars codes
a 61
b 62
c 63
d 64
e 65
f 66
g 67
h 68
i 69
j 6a
k 6b
l 6c
m 6d
n 6e
o 6f
p 70
q 71
r 72
s 73
t 74
u 75
v 76
w 77
x 78
y 79
z 7a

물론 다음을 사용하여 이 작업을 수행할 수도 있습니다 paste.

$ paste chars codes
a   61
b   62
c   63
d   64
e   65
f   66
g   67
h   68
i   69
j   6a
k   6b
l   6c
m   6d
n   6e
o   6f
p   70
q   71
r   72
s   73
t   74
u   75
v   76
w   77
x   78
y   79
z   7a

답변3

GNU를 사용하는 경우 awk확장 라이브러리를 포함할 수 있습니다 ordchr.

echo abshdfitiggwigiwjirjgiejrigjr |
    awk -lordchr -F '' '{for(i=1;i<=NF;i++)printf "%c %x\n", $i, ord($i)}'
a 61
b 62
s 73
h 68
...

ord()-문자를 10진수로 변환하는 함수
printf "%x", ord($i)-10진수를 16진수로 변환
또한: chr()-십진수를 문자로 변환

답변4

직접 작성하는 대신 기존 프로그램을 사용하는 것은 어떨까요? 나는 추천한다ascii에릭 S. 레이먼드로부터.

위의 명령을 사용하여 ASCII 문자의 16진수 값을 출력하려면 다음 명령을 실행하십시오 ascii -x.

출력 예:

   00 NUL    10 DLE    20      30 0    40 @    50 P    60 `    70 p 
   01 SOH    11 DC1    21 !    31 1    41 A    51 Q    61 a    71 q 
   02 STX    12 DC2    22 "    32 2    42 B    52 R    62 b    72 r 
   03 ETX    13 DC3    23 #    33 3    43 C    53 S    63 c    73 s 
   04 EOT    14 DC4    24 $    34 4    44 D    54 T    64 d    74 t 
   05 ENQ    15 NAK    25 %    35 5    45 E    55 U    65 e    75 u 
   06 ACK    16 SYN    26 &    36 6    46 F    56 V    66 f    76 v 
   07 BEL    17 ETB    27 '    37 7    47 G    57 W    67 g    77 w 
   08 BS     18 CAN    28 (    38 8    48 H    58 X    68 h    78 x 
   09 HT     19 EM     29 )    39 9    49 I    59 Y    69 i    79 y 
   0A LF     1A SUB    2A *    3A :    4A J    5A Z    6A j    7A z 
   0B VT     1B ESC    2B +    3B ;    4B K    5B [    6B k    7B { 
   0C FF     1C FS     2C ,    3C <    4C L    5C \    6C l    7C | 
   0D CR     1D GS     2D -    3D =    4D M    5D ]    6D m    7D } 
   0E SO     1E RS     2E .    3E >    4E N    5E ^    6E n    7E ~ 
   0F SI     1F US     2F /    3F ?    4F O    5F _    6F o    7F DEL

관련 정보