여러 직원이 포함된 텍스트 파일이 있습니다. 텍스트 파일은 이 구성표를 따릅니다.
사원 이름 부서 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"