직원의 일급과 시급을 계산하는 awk 명령 또는 스크립트

직원의 일급과 시급을 계산하는 awk 명령 또는 스크립트

여러 직원이 포함된 텍스트 파일이 있습니다. 텍스트 파일은 이 구성표를 따릅니다.

사원 이름 부서 20.00

일일 임금을 계산하려면 변수가 있는 awk 명령이 필요합니다. 또한 각 필드를 탭과 달러 기호로 구분하여 시간당 및 일일 요율과 /hr 및 /day 후행 텍스트를 표시해야 합니다. 예를 들어

      직원 이름 부서 $20.00/시간 $160/일
      직원 이름 부서 $50.00/시간 $400/일
      직원 이름 부서 $200.00/시간 $1600/일

또한 모든 근로자의 시간당 임금을 합산하여 표시하고 "근로자는 시간당 총 $889(또는 총액)를 벌어들입니다."라는 텍스트를 표시해야 합니다.

저는 awk를 처음 접했고 인터넷 검색을 좀 해봤지만 어디서부터 시작해야 할지 잘 모르겠습니다.

답변1

awk '{$NF="$"$NF"/hr " "$"$NF*8"/day";print $0}' filename

산출

Adam Adamson Accounting $20.00/hr $160/day
Iver Iverson InfoTech $50.00/hr $400/day
Cary Caryson ChiefExecutive $200.00/hr $1600/day
Mary Maryson Maintenance $15.00/hr $120/day
Stan Stanson SalesDept. $10.00/hr $80/day
Scot Scotson SalesDept. $10.00/hr $80/day
Eric Ericson Executive $100.00/hr $800/day
Enid Enidson Executive $100.00/hr $800/day
Maye Mayeson Maintenance $15.00/hr $120/day
Axel Axelson Accounting $21.00/hr $168/day
Pete Peteson PayrollDept. $15.50/hr $124/day
Mick Mickson Marketing $12.00/hr $96/day
Iris Irisson InfoTech $55.00/hr $440/day
Hank Hankson HumanRes $42.42/hr $339.36/day

답변2

awk -v hpd=8 '
  { printf "%s\t%s\t%s\t$%.2f/hr\t$%.2f/day\n", $1, $2, $3, $4, $4 * hpd;
    ht += $4; # hourly total
  };

  END {
    printf "\nWorkers earned a combined $%.2f per hour\n", ht
  }
' input.txt
Adam    Adamson Accounting      $20.00/hr       $160.00/day
Iver    Iverson InfoTech        $50.00/hr       $400.00/day
Cary    Caryson ChiefExecutive  $200.00/hr      $1600.00/day
Mary    Maryson Maintenance     $15.00/hr       $120.00/day
Stan    Stanson SalesDept.      $10.00/hr       $80.00/day
Scot    Scotson SalesDept.      $10.00/hr       $80.00/day
Eric    Ericson Executive       $100.00/hr      $800.00/day
Enid    Enidson Executive       $100.00/hr      $800.00/day
Maye    Mayeson Maintenance     $15.00/hr       $120.00/day
Axel    Axelson Accounting      $21.00/hr       $168.00/day
Pete    Peteson PayrollDept.    $15.50/hr       $124.00/day
Mick    Mickson Marketing       $12.00/hr       $96.00/day
Iris    Irisson InfoTech        $55.00/hr       $440.00/day
Hank    Hankson HumanRes        $42.42/hr       $339.36/day

Workers earned a combined $665.92 per hour

첫 번째 코드 블록(즉, 첫 번째 중괄호 쌍 내부 {) }은 입력 파일( input.txt이 경우)의 각 줄에 대해 실행됩니다. 이 END {...}블록은 모든 입력을 읽고 처리한 후에 한 번만 실행됩니다.

hpd=8명령줄 섹션을 변경하여 하루 시간 수를 변경할 수 있습니다. 8개로 하드코딩할 수도 있지만, 변수로 만드는 게 더 재미있는 것 같아요.

연습으로 최종 printf명세서를 수정하여 일일 합계도 인쇄할 수 있는지 확인해 보세요. 이를 이해하면 printf 문이 수행하는 작업을 이해하는 데 도움이 됩니다. 출력은 다음과 유사해야 합니다.

Workers earned a combined $665.92 per hour or $5327.36 per day

답변3

어려운 방법. 다차원 배열만 사용하는 GNU awk의 경우. 열의 형식은 내용의 길이에 관계없이 유지됩니다( column -t이 유틸리티를 사용할 때와 마찬가지로). 구분 기호는 OFS 변수에 전역적으로 정의됩니다.

awk -v pre="$" -v suf="/hr" '
        {hr+=$NF;
        for(i=1; i<=NF; i++) {
                row[NR][i]=$i
                l=length($i)
                if(l>len[i]) len[i]=l
                }
        }
END     {for(i in row){
                for(j in row[i])
                        printf("%-*s" OFS, (j==NF?4:0) + len[j],
                                j==NF? pre row[i][j] suf: row[i][j])
                print pre row[i][j] * 8 "/day"
                }
        print "\nworkers earned a combined $" hr " per hour"
        }
' OFS='\t' file

첫 번째 부분에서는 인쇄할 때 각 열의 최대 너비가 계산되고 그에 따라 들여쓰기됩니다.

답변4

awk를 사용해야 하나요?

#!/bin/bash
while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do
    a=($(echo "$LinefromFile"))
    printf "%-20s" $a[1] $a[2] $a[3] 
    printf "%-20s%.2f" $a[4] $((a[4] * 8))
    printf "\n"
done < "$1"


관련 정보