2013-01-23 2 views
0

awk를 사용하여 일부 합계를 계산하고이를 파일에 저장하려고합니다.awk에서 결과 얻기 및 파일로 인쇄

여기 내 입력 파일입니다

misses 15 
hit 18 
misses 20 
hit 31 

그리고 파일에 총 미스, 총 히트를 인쇄 할. 나는이 실행하는 경우

는 :

awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt 

을 나는 터미널에서 그들을 참조하십시오.

는 지금은 파일에 쓰기 원하는 :

내가이 시도 :

#!/bin/bash 
awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt 

echo misses $misses > $1; #first one overwrites the previous $1 is the argument given in the command line 
echo hits $hits>> $1; # all the othes append to the .txt file 

을하지만 값을 $misses, and $hits가 없습니다.

나는이 시도 : 나는 위해, 웹에서 본

#!/bin/bash 
result= $(echo $output | awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 
# $NF if I want the last column 
echo $result 

은 $ 결과가 나에게 반환을 확인하려면 다음을하지만 난이 오류 얻을 :

./test2.sh: line 2: Hits:: command not found 

답변

3

hitsmissesawk 종료 후에 셸이 아닌 awk 내부의 변수입니다.

두 번째 시도에서
#!/bin/bash 
awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt > $1 

, 당신은 '='뒤에 공백을 넣을 수 없습니다 :

여기
result=$(echo $output | awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 
1

단순히 출력을 리디렉션을 awk 명령들 :

awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt >file.txt 

리디렉션 연산자 > 어떤 SH에 추가 될 수있다 ell 명령을 사용하여 표준 출력을 파일로 재 지정하십시오. >>으로 변경하면 알아 차린 것처럼 파일을 완전히 덮어 쓰지 않고 파일에 명령의 출력을 추가합니다.

편집 :

이유는 문제가 해결되지 않은 :

#!/bin/bash 
awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt 

echo misses $misses > $1; #first one overwrites the previous $1 is the argument given in the command line 
echo hits $hits>> $1; # all the othes append to the .txt file 

때문에 $ 미스와 $ 안타는 awk 스크립트에 지역 변수입니다. 따라서 쉘은 그 문장 밖의 아무 것도 모릅니다. 그래서 여러분이 그것들을 반향하려고하면 공백이 생깁니다.

이 작동하지 않습니다 : 여러 가지 이유로

#!/bin/bash 
result= $(echo $output | awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 
# $NF if I want the last column 
echo $result 

. bash는 변수를 할당 할 때

1), 당신은 등호 주위의 공백을 가질 수 없습니다, 그래서 두 번째 줄은 시작해야합니다

`result=$(echo...` 

2) 대체 (echo $output) 내부 에코 문이 필요하지 않습니다. a) $output이 정의되어 있지 않으므로 echo이 출력을 생성하지 않으며, b) 파이프 라인의 두 번째 명령문 (awk 문)은 파일 이름을 지정 했으므로 어쨌든 파이프 라인에서 앞에 오는 명령의 표준 출력을 완전히 무시합니다 행동하십시오 (t.txt).그래서 두 번째 줄은 수 :

result=$(awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 

3) 끝 부분에 echo 문은 사실에도 불구하고, 한 줄에 모든 결과가 표시됩니다 AWK 문 인쇄 두 줄이. 이것은 echo 문에서 변수를 인용하지 않았기 때문입니다. 대신이 시도 : 당신은 당신이 원하지 않는 이유를 확실히 알지 못한다면

echo "$result" 

를 bash는 스크립트의 규칙, 당신은 항상 당신이 전달하는 변수 나 인쇄를 인용한다.

희망은 당신이 시도한 것에 대해 조금 더 배우는 데 도움이됩니다!

0

좀 더 컴팩트 한 솔루션입니다 : 그냥 다음을 수행

#!/bin/bash 
awk ' 
    {tally[$1] += $2} 
    END { 
     for (outcome in tally) { 
      print outcome ":", tally[outcome] 
     } 
    }' t.xt > $1 

당신 AWK에서 변수를 초기화 할 필요가 없습니다. 처음으로 AWK를 사용할 때 AWK는 숫자에 대해 0을, 문자열에 대해 ""를 가정합니다. 컨텍스트에 따라 다릅니다.