2014-12-12 2 views
1

스크립트에서 awk 명령을 해석하려고합니다. 이 명령은 파일의 정상적인 필드 수를 포함하는 변수를 포함하고 있으며이 필드 수와 일치하지 않는 행을 제거하려고합니다.은 bash 스크립트에서 awk 명령을 해석합니다.

filename='myfile.txt' 

nbfields=$(head -1 $filename | awk -F '|' '{print NF}') 
awkcommand="awk -F '|' 'NF=="$nbfields"{print \$0}'" 

$awkcommand > 'myotherfile.txt' 

실행, 나는 오류 얻을 :

여기 내 코드입니다

awk: cmd. line:1: 'NF==3{print 
awk: cmd. line:1:^invalid char ''' in expression 

내가 함께하고 \$0 전에없이 시도를하지만 동일합니다.

나는 eval을 사용하여 작동하게 만들 수 있지만 가능하면 eval을 사용하지 않는 것이 좋습니다. 내가 이해하는 한, 그것을 사용하는 것은 위험합니다. 그것을 피할 수있는 방법이 있습니까?

답변

2

당신은 head 필요하지 않습니다, 당신은 할 수 있습니다 :

awkcommand() { awk -F '|' -v n=$nbfields 'NF==n' file; } 

는 또한 AWK에 쉘 변수를 전달하는 올바른 방법을 참고 : 더 나은

nbfields=$(awk -F '|' '{print NF;exit}' file) 

는 AWK 명령을 저장하는 기능을 사용하려면 -v 옵션을 사용하십시오.

+1

덕분에 많이. 나는 -v 옵션에 대해 몰랐다. 산뜻한. 문제 해결됨. – bosonfute

1

내가 이해 한대로, 첫 번째 행을 기준으로 필드 수를 계산 한 다음 동일한 수의 필드가있는 파일의 모든 행을 인쇄하려고합니다. 옳은?

당신은 이런 식으로 그렇게 할 수 -

awk -F'|' 'BEGIN{i=0}{if(i==0){fields=NF;i=1} if (fields==NF) print $0;}' 
+1

예, 작동합니다. 하지만 사실, 다른 파일에서 필드 수를 얻고 있습니다. 그래서 awk에 변수를 전달해야합니다. – bosonfute

관련 문제