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
입니다 .END
dc
범용, 임의 정밀도 계산기로 기능할 수 있을지 dc
모르기 때문에 사용했습니다 . awk
그렇다면 다음과 같이 할 수 있습니다.
awk -F ',,*' '(NR > 1){ gsub("[^0-9,]",""); SUM_SALARY += $2 } END { print SUM_SALARY }' < text.csv
awk
이 경우는 산술 연산이 대신 수행된다는 점을 제외하면 이전 경우와 매우 유사하게 작동합니다 dc
. 또한 -F
사용되지 않는 블록을 방지하기 위해 스위치를 사용하여 필드 구분 기호를 설정합니다 BEGIN
.