나는 파일의 모든 단어를 뒤집는 매우 간단한 awk 스크립트를 작성했습니다.
awk '
{
for (i=1;i<=NF;i++)
{ x=""
for(j=length($i);j>0;j--)
x=x substr($0,j,1);
print x
}}' file1
file1의 내용은 다음과 같습니다.
hello
이제 나를 혼란스럽게 만드는 것은 -를 교체할 때입니다.
print x
그리고
print $x
즉, 기록된 출력을 얻습니다. 알겠어요안녕하세요반대 출력이 아님올레.
$x를 사용하면 왜 $0의 콘텐츠가 제공되나요? 변수는 awk에서 어떻게 작동하나요? 정말 혼란스럽습니다. $x를 사용해야 하는 경우와 x만 사용해야 하는 경우에 대한 정해진 규칙이 있나요?
답변1
x
당신의 awk 변수는 $x
뭔가 다른 것입니다 ...
$0
방금 읽은 줄의 입력 문자열 내용에 해당하고 $1
...는 기본 구분 기호를 사용하는 분석 필드에 해당합니다 $n
.$0
awk를 사용하면 변수를 사용하여 프로그래밍 방식으로 필드에 액세스할 수 있습니다. 즉 , 변수에 MyValue
가 포함되어 있으면 와 동일합니다 .5
$MyValue
$5
여기서 일어나는 일은 변수에 숫자로 해석되는 문자열이 x
포함되어 있다는 것입니다 . awk에서 숫자가 아닌 값으로 시작하는 모든 문자열은 예를 들어 숫자 값으로 사용될 때 로 해석됩니다 . 예 를 들어 로 해석되기 때문에 로 평가됩니다 . 따라서 귀하의 경우 와 마찬가지로 제공된 입력 문자열입니다 .olleh
0
0
5*"test"
0
"test"
0
$x
$0
hello
답변2
먼저 유효한 변수가 무엇인지 알아야 합니다 awk
. POSIX 정의awk 변수처럼:
이식 가능한 문자 집합의 또는 알파벳 문자
<underscore>
(XBD 이식 가능한 문자 집합의 표 참조)로 시작하여 이식 가능한 문자 집합의 일련의 밑줄, 숫자 및 문자, 마지막으로 "=" 문자, 변수 할당이 옵니다. 경로 이름 대신 지정해야 합니다.
따라서 awk
변수가 있고 x
이를 사용하려면 x
해당 변수를 참조하고 x
example print x
또는 을 작성하면 됩니다 y = x
.
을(를) 사용하면 $x
액세스됩니다.awk 필드 변수. 에서 awk
필드 변수는 숫자 또는 숫자 표현식을 따라 액세스됩니다. $
그래서 글을 쓸 때 $x
먼저 awk
평가를 하게 됩니다 x
. 예를 들어 x에 숫자 값이 있는 경우 1
명령문은 가 되어 $1
첫 awk
번째 필드 변수의 값을 제공합니다. 또는 이와 같은 숫자 표현식이 있고 (1+1)
가 $(1+1)
되면 $2
두 번째 필드 변수의 값을 얻게 됩니다.
필드 번호 표현식이 나누기로 평가되는 경우음이 아닌 정수, 동작이 지정되지 않았습니다( x = "qwerty"
또는 인 경우 x = "qwerty"+1
액세스 $x
가 지정되지 않음).
이 맥락에서 음이 아닌 정수 이외의 것으로 평가되는 지정되지 않은 필드 숫자 표현식의 효과는 초기화되지 않은 변수 또는 문자열 값을 숫자 값으로 변환할 필요가 없습니다.
귀하의 경우 awk
구현에서는 필드 번호 표현식(문자열)을 평가하므로 0
변수 값을 얻습니다. $0
다른 awk
구현에서는 결과가 다를 수 있습니다(적어도 OpenBSD에서는 awk
오류가 발생합니다 illegal field
).