정보가 포함된 파일이 있습니다.
Name Rate Hours
Clark 8.5 42
Sarah 18.5 19
Joe 10 25
Paul 12 5
총 급여를 계산하고 싶습니다.각직원.
i <=
하지만 파일 시작 부분의 헤더( , , )가 무엇으로 연결되는지 확실하지 않기 때문에 루프를 작동시킬 수 없습니다 .Name
Rate
Hours
지금까지 나는 이것을 가지고 있습니다 :
awk 'BEGIN{
total = 0;
}
{
rate = $2;
hours = $3;
for (i = 1; i<= NR; i++)
{
total = rate * hours;
}
}
END {
print "Total = $" total;
}' testfile.dat
당신의 도움에 미리 감사드립니다!
답변1
대안으로 다음과 같은 것이 잘 작동하고 좋은 결과를 얻습니다.
awk -v OFS="\t" 'NR==1{$4="total"}NR>1{$4=$2*$3}1' testfile.dat
#Output:
Name Rate Hours total
Clark 8.5 42 357
Sarah 18.5 19 351.5
Joe 10 25 250
Paul 12 5 60
답변2
awk는 대부분의 스크립트 주위에 암시적 루프를 배치합니다. 블록(및 함수 정의)을 제외하고 BEGIN
스크립트 END
는 각 행을 순차적으로 실행합니다. 따라서 awk 스크립트와 같은 루프를 갖는 것은 이상할 것입니다 for (i = 1; i<= NR; i++)
. awk가 첫 번째 라인을 실행할 때 for 루프 본문이 실행되고 i=1
awk가 두 번째 라인을 실행하고 루프 본문 for i=1
and 가 실행된 i=2
다음 awk가 두 번째 라인을 실행합니다. i=1
및 i=2
등 의 루프 본문 i=3
이 실행됩니다.
중복된 직원 이름이 없다고 가정하면 각 직원의 총 급여는 입니다 $2 * $3
. 필요한 경우 이를 인쇄할 수 있습니다.
NR == 1 { print $1, $2, $3, "total" }
NR != 1 { print $1, $2, $3, $2 * $3 }
(조건은 NR == 1
헤더 행을 식별합니다.)
모든 직원의 총 급여는 머리글 행을 제외한 모든 행에 대한 이 표현식의 합계입니다. 모든 직원의 총 급여를 계산하려면 현재 직원의 급여를 누계에 추가하세요.
NR != 1 { total += $2 * $3 }