2012-11-12 2 views
0

이것은 stdin에서 사용자의 입력으로 문자열을받는 쉘 스크립트입니다.awk는 인수와 입력 파일을 어떻게 구분합니까?

#!bin/sh 
printf "Enter your query\n" 

read query 
cmd=`echo $query | cut -f 1 -d " "` 
input_file=`echo $query | cut -f 2 -d " "` 
printf $input_file 

if [ $input_file = "" ] 
then 
    printf "No input file specified\n" 
    exit 
fi 
if [ $cmd = "summary" ] 
then 
    awk -f summary.awk $input_file $query 
fi 

그가

summary a.txt /o foo.txt 

지금 cmd 변수 값 summary을하고 input_filea.txt 걸릴 것입니다 입력 말할 수 있습니다. 그렇지 않나요?

에있는 내용을 토대로 summary.awk이 $input_file에서 작업하기를 원합니다. 다음과 같이

나의 이해는 다음과 같습니다

  1. 입력 파일로 처리됩니다 전달 된 첫 번째 명령 행 인수. 예 : : 입력 파일이 파이프 경우 awk 'code' file arg1 arg2 arg3file가 입력 파일

  2. 로 처리됩니다, 그것은 입력 파일로 인수가 표시되지 않습니다. 예 : : cat file | awk 'code' arg1 arg2 arg3 arg1은 입력 파일로 처리되지 않습니다.

맞습니까?

문제는 왜 summary을 열려고 내가 awk: cannot open summary (No such file or directory) 을 얻을 입니까? $input_file 다음의 단어입니다.

이 문제를 어떻게 해결합니까?

+0

''query '를''query'를''cut ''으로 구문 분석 한 다음에''read cmd input_file remainder' (IFS가 적당한 값인지 확인하십시오) –

+0

[이 답변] (http : //stackoverflow.com/q/18825007/812102). –

답변

3

-f 옵션이없는 경우 첫 번째 옵션이 아닌 인수는 스크립트로 처리되고 나머지 인수는 입력 파일입니다. -f 옵션이있는 경우 스크립트는 해당 파일에서 가져오고 나머지는 입력 파일입니다.

입력 파일 인수가없는 경우에만 stdin에서 입력을 읽습니다. 이것은 awk에 파이프하고 파일 이름 인수를 주면 파이프를 무시한다는 것을 의미합니다.

이것은 대부분의 유닉스 파일 처리 명령과 동일합니다.

이 시도 :

awk -f summary.awk -v query="$query" "$input_file" 

이 쿼리의 내용에 AWK 변수 query을 설정합니다.

+0

그래서 awk 스크립트에 데이터를 전달하는 올바른 방법은 -v 옵션을 사용하는 것입니다. 그렇지 않으면 전달 된 args는 필연적으로 반복되는 입력 파일로 간주됩니까? – batman

+0

예. 나는 당신이 읽고 입력 파일을 제거하는 스크립트에서'ARGV'에 할당 할 수 있다고 생각하지만, 그것은 당신이 원하는 것을하는 가장 좋은 방법은 아닙니다. – Barmar

+0

awk 스크립트에서'query'를 출력하려고했습니다.그것은 말한다 :'변수 쿼리에 대한 불법 참조 '. 그리고 우리는'$ query' 또는 그와 비슷한 것에 대해 큰 따옴표를 사용해야합니까? 내 말은, 쉘 스크립트 파일에 아직 남아 있습니다. 그래서해야합니까? – batman

관련 문제