2012-04-22 11 views
0
에 파일 이름을 포함하는/bash는

I가 다음 awk 스크립트 :AWK 방법 AWK

#! /bin/awk -f 

BEGIN { FS = ":" } 

{ print $1 " " $2 " " $3 " " $4 " " } 

내가 "#!/빈/bash에"와 bash는 스크립트를 코딩 할,하지만 난을 포함해야 그것으로 파일; 프로그램이 파일을 표시 할 때

#! /bin/bash 

awk -f, ' 
FILENAME= $1 
BEGIN { FS = ":" } 

{ print $1 " " $2 " " $3 " " $4 " " } 

' 

는 위의 코드에서, 나는 파일을 포함하도록 시도했지만 작동 나던?

답변

0

나 질문에서 이야기하는 것은 어렵다,하지만 난 당신이 원하는 것은 당신이 쉘 스크립트로 통과 파일에 awk가 실행됩니다

#!/usr/bin/env bash 

awk -F, ' 
{ 
    #do stuff 
}' "$1" 

생각합니다.

그러나 awk 내부에서 스크립트 변수를 바꾸려면 리터럴 문자열에서 벗어나 변수를 가져올 수 있습니다. 예를 들어 :

#!/usr/bin/env bash 

filename="$1" 
awk -F, ' 
{ 
    print "'"$filename"'" 
}' "$1" 

는 파일에있는대로 많은 라인을 위해 전달 된 파일 이름을 인쇄합니다. 이렇게하면 awk가 모든 변수를 리터럴 문자열로 처리하게됩니다. 그러면 다음과 같이 작동합니다.

#!/usr/bin/env bash 

filename="$1" 
awk -F, ' 
BEGIN { 
    awksFileName="'"$filename"'" 
} 
{ 
    print awksFileName 
}' "$1" 
+0

내 작업은 다음과 같습니다 : 1. \t 옵션의 조합으로 실행할 수있는 search_hotels라는 쉘/awk 스크립트를 작성하십시오 : 그리고 쉘을 사용하고 AWK를 내부에 넣어야합니다 , 나는 AWK로 이것을 할 수 있는지 모른다. 이것이 AWK에 파일을 전달해야하는 이유입니다.그래서 나는 내 프로그램을위한 옵션을 만들 수있다. – user1253622

+0

나는 아직도 너가 뭘하고 있는지 확실하지 않지만 편집을 봐. 위에 사용 된 것과 동일한 트릭을 사용하여 쉘 변수를 awk 변수에 할당 할 수 있습니다. –

+0

그러나 가장 쉬운 방법은 원하는 모든 파일 이름을 알고있는 경우 awk에 내장 된 FILENAME 변수를 사용하는 것입니다. –

2

여기에 전달하려는 항목이 명확하지 않습니다. 파일 이름을 값으로 가져 오는 변수를 원하십니까? 가장 쉬운 방법은 그 -v var=value을 사용하는 것입니다 수행

#! /bin/bash 

awk -v MYFILENAME="$1" ' 
BEGIN { FS = ":" } 

{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " } 
' 

참고 파일 이름이 예약 된 변수는, 당신은 그것을 설정할 수 없습니다.

또는 입력 파일을 전달 하시겠습니까? 이 경우 당신은 단순히 같이 프로그램지나 전달할 :

#! /bin/bash 

awk ' 
BEGIN { FS = ":" } 

{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " } 
' "$1" 

-f 옵션은 BTW, awk 스크립트를 포함하는 것입니다. 따라서 -f,은 AWK에 ,이라는 파일을 포함하도록 요청할 것입니다.

셸 수준에서 "..."으로 변수를 항상 묶어야합니다 (예 : "$1"). 공백으로 파일 이름을 올바르게 처리해야합니다.

+0

그럼 내 임무는 다음과 같습니다 : 1. \t 옵션의 모든 조합으로 실행할 수있는 search_hotels라는 쉘/awk 스크립트를 작성하십시오 : 그리고 이렇게하려면 쉘과 AWK를 넣어야합니다. 내가 AWK로 이것을 할 수 있는지 모른다. 이것이 AWK에 파일을 전달해야하는 이유입니다. 그래서 나는 내 프로그램을위한 옵션을 만들 수있다. – user1253622

+0

하나의 셸 부분과 다른 AWK 부분의 두 파일로 나누지 않는 이유는 무엇입니까? 그것들을'myscript.sh'와'myscript.awk'라고 부르 자. 그런 다음 쉘 스크립트에서'awk -f myscript.awk one_or_more_filenames'를 호출합니다. – DarkDust

+0

아 : D 나는 이것에 대해 생각하지 않았다 :). 나는 그것을 시도 할 것이다 :). – user1253622

0

실제로 파일 이름을 가져올 때 bash를 사용할 필요는 없습니다.

[[email protected] ~]$ cat text 
one:two:three:four 
cyan:yellow:magenta:black 
[[email protected] ~]$ cat doit.awk 
#!/usr/bin/awk -f 

BEGIN { FS=":" } 

{ 
    printf("%s %s %s %s\n", $1, $2, $3, $4); 
} 

[[email protected] ~]$ ./doit.awk text  
one two three four 
cyan yellow magenta black 
[[email protected] ~]$ 

그러나 Tim이 제안한 것처럼 질문에 포함 된 내용을 기반으로 원하는 결과를 파악하는 것은 어렵습니다. 다른 이유로 인해 bash에서 awk 스크립트를 실행해야합니까? awk 스크립트에서 NAME이라는 파일을 실제로 사용할 수 있습니까?

더 자세한 질문을 제공할수록 응답의 세부 정보가 더 정확 해집니다.