다음과 같은 "random"이라는 파일이 있습니다.
A B C D
A B C D
A B C D
이 쉘 스크립트가 두 번째 열을 인쇄하도록 하려면 어떻게 해야 합니까?
#! /usr/bin/tcsh -f
set variable = "2"
awk '{print "$""'"$variable"'" }' random
그것은 다음을 제공합니다:
$2
$2
$2
$2
$2
$2를 다음과 같이 하드코딩하면:
#! /usr/bin/tcsh -f
awk '{print $2 }' random
알겠어요
B
B
B
하지만 매번 다른 값을 설정해야 하므로 하드 코딩은 선택 사항이 아닙니다.
답변1
awk의 options 을 사용하여 변수를 awk에 전달합니다 -v
. 예를 들어 awk 변수를 n
csh 변수와 동일한 값으로 설정합니다 $variable
.
% set variable=2
% awk -v n="$variable" '{print $n}' random
B
B
B
또는 스크립트 뒤에 변수 할당을 인수로 전달합니다(awk는 인수를 x=y
파일 이름이 아닌 할당으로 해석합니다).
% set variable=4
% awk '{print $n}' n="$variable" random
D
D
D
두 경우 모두 awk 스크립트는 이를 $n
"필드 번호 n"으로 해석합니다.
또는 환경 변수를 사용할 수 있습니다. awk는 배열을 통해 접근할 수 있습니다 ENVIRON
. 예를 들어
% setenv variable 2
% awk '{print $ENVIRON["variable"]}' random
B
B
B
BTW는 다른 사람들이 의견에서 언급했듯이 csh
/ tcsh
스크립팅 언어로는 좋은 선택이 아닙니다. 쉘 스크립트를 작성하려면 Bourne과 같은 쉘을 사용하십시오. tcsh
대화형 셸로는 여전히 괜찮지만 다른 셸이 아직 제공하지 않는 것을 제공하지 않습니다. csh는 1980년대에는 뛰어난 대화형 셸이었지만 다른 셸은 오래 전에 이를 능가했습니다(그리고 csh에는 단점도 있습니다. good 스크립팅 셸 언어는 다르기 때문에 대화형으로 사용하는 것만으로는 스크립팅 경험을 얻을 수 없습니다. bash, ksh 또는 zsh로 전환해 보세요.
답변2
(t)csh의 모든 단점을 기억하지는 못하지만 POSIX와 유사한 셸에서 작동하는 방식과 유사하다고 가정합니다. '{print "$""'
큰따옴표를 포함하는 인용된 문자열이 있고 그 "$variable"
다음에는 인용된 변수 확장이 있습니다 '" }'
. awk가 얻는 것은 {print "$""2" }
awk로 연결된 두 개의 awk 문자열이 연속적으로 있다는 것입니다. 그러나 그것들은 $
연산자가 아니라 문자열입니다.
awk '{print "$""'"$variable"'" }'
<--quoted---><---var---><-q->
추가 큰따옴표를 제거합니다.
tcsh> set variable = 2
tcsh> echo a b c | awk '{print $'"$variable"' }'
b
또는 POSIX-y 셸에서:
$ variable=2
$ echo a b c | awk '{print $'"$variable"' }'
b