쉘스크립트를 사용하여 열 합계 계산

쉘스크립트를 사용하여 열 합계 계산

csv 파일이 있고 text.csv모든 직원의 총 급여를 계산하고 싶습니다. 내부 데이터는 다음과 같습니다.

Id,name,salary,designation
12,joe,thomas,253637,IT,admin
25,miacheal,364829,software engineer
46,mike,silva,adam, 374829479, senior, software, engineer
85,amber johnson,3728291,IT
24,Austin barclay, 3701830,software engineer

나는 사용해 보았습니다.

awk -F "," '{ SUM_SALARY += $3 } END { print SUM_SALARY }'

하지만 합계가 틀립니다. 실제 데이터는 550만 개입니다.

답변1

마이그레이션된 급여 필드(필드 3에서 필드 5로 그리고 그 반대로)가 있다고 가정하면 두 GNU는 grep급여를 분리하여 다음으로 전달할 수 있습니다.numsum:

grep -o '[, ][[:digit:]]*,' test.csv | grep -o '[[:digit:]]*' | numsum 

산출:

382878066

답변2

입력란 name에 쉼표가 포함되어 있지만 따옴표로 묶지 않았으므로 각 행의 열에 awk다양한 유형의 값이 표시됩니다 $3. 인용된 경우에도 마찬가지이지만 여기에 표시된 경우에는 실제 CSV 파서라도 도움이 되지 않습니다. 문제를 해결하기 위해 내가 한 일은 다음과 같습니다.

awk 'BEGIN { FS=",,*"; print 0 }
     (NR > 1) { gsub("[^0-9,]",""); printf "%d+\n", $2 }
     END { print "pq" }' < text.csv \
| dc

먼저 gsub각 행에서 숫자나 쉼표가 아닌 모든 항목을 제거한 다음 새 두 번째 열의 값을 인쇄하는 데 사용됩니다. 여기서 열은 하나 이상의 쉼표로 구분된 것으로 간주됩니다. 데이터가 예상된 형식 으로 작동하도록 하는 블록 BEGIN입니다 .ENDdc


범용, 임의 정밀도 계산기로 기능할 수 있을지 dc모르기 때문에 사용했습니다 . awk그렇다면 다음과 같이 할 수 있습니다.

awk -F ',,*' '(NR > 1){ gsub("[^0-9,]",""); SUM_SALARY += $2 } END { print SUM_SALARY }' < text.csv

awk이 경우는 산술 연산이 대신 수행된다는 점을 제외하면 이전 경우와 매우 유사하게 작동합니다 dc. 또한 -F사용되지 않는 블록을 방지하기 위해 스위치를 사용하여 필드 구분 기호를 설정합니다 BEGIN.

관련 정보