파일 이름이 있습니다x
$ cat x
1A34532112345
awk
내가 작성한 스크립트를 사용하여(웹의 도움으로) 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
%d
A
HEX
답변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")
다시 숫자가 필요하므로 문자열이 숫자로 변환됩니다.
당신이 찾고있는 것은 ord
awk에 기본이 아닌 기능입니다. 이것멍청한 문서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진수 값이 포함되어 있기 때문입니다. 작업이 언급되지 않은 동안 다시 형식을 지정해야 하는 자명한 더 큰 필요가 없는 한 .