awk: 각 줄을 얻기 위해 파일을 반복하는 방법은 무엇입니까?

awk: 각 줄을 얻기 위해 파일을 반복하는 방법은 무엇입니까?

정보가 포함된 파일이 있습니다.

Name   Rate   Hours



Clark  8.5    42
Sarah  18.5   19 
Joe    10     25
Paul   12     5

총 급여를 계산하고 싶습니다.직원.

i <=하지만 파일 시작 부분의 헤더( , , )가 무엇으로 연결되는지 확실하지 않기 때문에 루프를 작동시킬 수 없습니다 .NameRateHours

지금까지 나는 이것을 가지고 있습니다 :

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=1awk가 두 번째 라인을 실행하고 루프 본문 for i=1and 가 실행된 i=2다음 awk가 두 번째 라인을 실행합니다. i=1i=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 }

관련 정보