그래서 급여 정보(예: $2674)에 대한 열이 포함된 파일이 있습니다.
indi salary
sam 2674
john 6375
max 9547
해당 수준(3열)의 급여 범위(1열 및 2열)가 포함된 또 다른 파일
salary_min salary_max Rank
2000 4000 Deputy
4000 6000 secretary
6000 8000 Assistant
8000 10000 Manager
이제 파일 1의 사람들을 급여에 따라 해당 수준에 할당하고 싶습니다.
따라서 최종 출력은
indi Rank
sam Deputy
john Assistant
max Manager
Linux에서 동일한 데이터 세트 유형을 사용하지만 더 큰 데이터를 사용하여 이를 달성하려면 어떻게 해야 합니까?
답변1
급여와 급여 범위가 항상 정수이고 급여 범위가 겹치지 않는다고 가정하면 다음과 같이 작동할 수 있습니다 bash
.
{ printf "indi Rank\n" ;
join -o1.1,2.2 <(tail -n +2 file1 | sort -b -k2,2) -1 2 -2 1 \
<(awk 'FNR > 1{for (i=$1; i<$2; ++i) printf "%d %s\n", i, $3}' file2 | sort -k1,1) ;}
indi Rank
sam Deputy
john Assistant
max Manager
답변2
대용량 데이터에는 권장하지 않지만 bash 솔루션을 사용해 볼까 생각했습니다. 난 별로 그렇지 않아유창한 배쉬, 그러나 이것은 "알고리즘적으로 말하자면" 일을 처리하는 "명백한" 방법인 것 같습니다. 이는 기본적으로 각 파일을 반복하고 적절한 범위를 검색합니다. 댓글에 몇 가지 자세한 내용을 알려 드렸습니다.
스크립트는 다음과 같이 실행되어야 합니다.
$ ./script.sh [salaries] [ranges]
이것샐러리파일에는 Sam, John, Max의 급여가 포함되어 있습니다.범위귀하의 범위와 레벨을 포함하십시오(대리인 경우 2000~4000, 비서인 경우 4000~6000 등).
#!/bin/bash
test $# -ne 2 && exit 1
test ! -r "$1" -o ! -r "$2" && exit 2
# Open the salary file (3) and the ranges (4).
exec 3< "$1"
exec 4< "$2"
# Echo the salary headers.
read -d$'\n' headers <&3
echo "$headers" | tr -s ' '
# For each line in the salary file...
while read name salary; do
# Skip the ranges headers ("salary_min...").
read -d$'\n' skip <&4
# For each range...
while read min max rankname; do
# If the salary is within the range, print name and rank.
if [ "$salary" -ge $min -a "$salary" -lt $max ]; then
echo "$name $rankname"
fi
done <&4
# Reopen the range file for the next employee.
exec 4>&-
exec 4< "$2"
done <&3
exit 0
내 범위 검사에는 하한이 포함되지만 상한은 포함되지 않습니다.
[ "$salary" -ge $min -a "$salary" -lt $max ]
예상한 동작이 아닌 경우 이 줄을 변경해야 할 수도 있습니다. 또한 가능한 한 적은 수의 파일로 파일을 열려고 시도했지만 bash가 처리하지 못하기 때문에파일 검색, 여전히 주기적으로 범위 파일을 닫거나 다시 열어야 합니다. 솔직히 매우 큰 파일을 다루는 경우 약간 낮은 수준의 구현을 사용하는 것이 좋습니다. C는 괜찮을 거예요.