2013-05-10 4 views
-1

나는 루프를 포함하고있는 셸 스크립트를 가지고있다. 이 루프는 다른 스크립트를 호출합니다. 각 루프 실행의 출력은 파일 (outOfLoop.tr) 안에 추가됩니다. 루프가 끝나면 awk 명령은 특정 열의 평균을 계산하고 그 결과를 다른 파일 (fin.tr)에 추가해야합니다. 마지막에는 (fin.tr)이 인쇄됩니다.평균을 계산하는 셸 스크립트와 awk 추출

루프의 결과를 (outOfLoop.tr) 파일에 추가하는 첫 번째 부분을 얻을 수있었습니다. 또한 내 awk 명령이 작동하는 것처럼 보입니다 ... 그러나 형식면에서 최종 예상 출력을 얻지는 못합니다. 나는 뭔가를 놓친 것 같아.

#!/bin/bash 

rm outOfLoop.tr 
rm fin.tr 

x=1 
lmax=4 

while [ $x -le $lmax ] 

do 
calling another script >> outOfLoop.tr 
x=$(($x + 1)) 
done 
cat outOfLoop.tr 
#///////////////// 
#//I'm getting the above part correctly and the output is : 
27 194 119 59 178 

27 180 100 30 187 

27 175 120 59 130 

27 189 125 80 145 
#//////////////////// 
#back again to the script 

echo "noRun\t A\t B\t C\t D\t E" 
echo "----------------------\n" 

#// print the total number of runs from the loop 
echo "$lmax\t">>fin.tr 

#// extract the first column from the output which is 27 
awk '{print $1}' outOfLoop.tr >>fin.tr 
echo "\t">>fin.tr 


#Sum the column---calculate average 
awk '{s+=$5;max+=0.5}END{print s/max}' outOfLoop.tr >>fin.tr 
echo "\t">>fin.tr 


awk '{s+=$4;max+=0.5}END{print s/max}' outOfLoop.tr >>fin.tr 
echo "\t">>fin.tr 

awk '{s+=$3;max+=0.5}END{print s/max}' outOfLoop.tr >>fin.tr 
echo "\t">>fin.tr 


awk '{s+=$2;max+=0.5}END{print s/max}' outOfLoop.tr >> fin.tr 
echo "-------------------------------------------\n" 


cat fin.tr 
rm outOfLoop.tr 

내가 좋아하는 형식이 원하는 : 나는 결과를 넣어 밖으로 사이에 새로운 라인이 거기로 0.5 awk 명령 내부 max을 증가했다

noRun A  B   C   D   E 
---------------------------------------------------------- 
4  27  average average  average average 

(여기 내 시도이다 outOfLoop 파일)

+0

가 왜에 훨씬 안하고의 출력 [태그 : AWK]? – Johnsyweb

+0

내 문제는 셸 스크립트에서 아닙니다. 그것은 awk 포맷에서 왔습니다! 내가 awk에서 전체를한다면 ... 문제는 여전히 해결되지 않습니다 !! – SimpleNEasy

+1

awk에서 모든 것을 쓰는 것이 문제를 해결할 수는 없지만 처음에는 문제가 발생할 가능성이 적어지고 그렇게했다면 해결하기가 훨씬 쉽습니다. –

답변

2
$ cat file 
27 194 119 59 178 

27 180 100 30 187 

27 175 120 59 130 

27 189 125 80 145 

$ cat tst.awk 
NF { 
    for (i=1;i<=NF;i++) { 
     sum[i] += $i 
    } 
    noRun++ 
} 
END { 
    fmt="%-10s%-10s%-10s%-10s%-10s%-10s\n" 
    printf fmt,"noRun","A","B","C","D","E" 
    printf "----------------------------------------------------------\n" 
    printf fmt,noRun,$1,sum[2]/noRun,sum[3]/noRun,sum[4]/noRun,sum[5]/noRun 
} 

$ awk -f tst.awk file 
noRun  A   B   C   D   E 
---------------------------------------------------------- 
4   27  184.5  116  57  160 
+0

감사합니다 ... 코드가 완벽하게 작동하지만 .. 'A'값이 인쇄되지 않습니다. 왜 확실하지 ??? – SimpleNEasy

+0

'A'값이 누락되었습니다. 업데이트를 참조하십시오. – SimpleNEasy

+0

흥미 롭습니다. 가장 최근의 awks는 읽은 마지막 레코드의 값을 "기억"하므로 END 섹션에서 직접 액세스 할 수 있으므로 보통 END 섹션에서 $ 1을 사용할 수 있고 첫 번째 필드를 참조 할 수 있습니다 읽은 마지막 레코드의 이것을 위해서 GNU awk와 많은 유용한 기능들을 얻는 것에 대해 생각하고 싶을 것입니다. –

관련 문제