저는 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줄로 구성된 두 개의 파일이 주어지면 파일은 NR
from 으로 이동 1
하지만 4
두 번째 파일의 첫 번째 줄을 읽을 때는 FNR
from 으로 이동한 다음 다시 로 이동 1
합니다 2
.1
2
그것들을 합치면 다음과 같이 할 수 있습니다:
## 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