H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-06T12:33:52.27|~^1000123.34567|~^2018-04-12T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^111930.02876|~^2018-10-23T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^2112320.028|~^2018-10-24T12:33:52.27|
R|~^abc|~^2019-03-06T12:33:52.27|~^12230.0809|~^2018-09-11T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^3076543789.00878|~^2018-08-05T12:33:52.27|
R|~^abc|~^2019-03-06T12:33:52.27|~^156655.0389|~^2018-10-23T12:33:52.27|
R|~^abc|~^2019-03-06T12:33:52.27|~^10453.0489|~^2018-04-08T12:33:52.27|
R|~^abc|~^2019-03-05T12:33:52.27|~^20654.0907|~^2018-07-23T12:33:52.27|
"R"로 시작하는 레코드의 네 번째 필드에서 총 금액의 합계를 구해야 합니다. 모든 행의 합계를 변수에 저장하고 싶습니다. 달성하는 방법
답변1
variable=$( awk -F '^' '$1 == "R|~" { sum += $4 } END { print sum }' file )
이 awk
명령은 데이터를 ^
구분된 것으로 처리하고 첫 번째 필드에 포함된 각 행의 네 번째 필드를 합한 다음 R
모든 데이터를 읽은 후 합계를 인쇄합니다. |~
필드 데이터를 숫자 값으로 변환하는 동안 필드 끝에 있는 숫자가 아닌 데이터(문자열)는 무시됩니다.
그런 다음 표준 명령 대체를 사용하여 awk
명령 출력을 변수에 할당합니다.
매우 큰 숫자의 경우 다음을 사용하십시오 bc
.
variable=$(
awk -F '^' '$1 == "R|~" { sub("\\|.*","",$4); print $4 "+\\" } END { print "0" }' file |
bc
)
bc
그러면 처리할 계산 으로 합계가 인쇄됩니다 . 이 bc
유틸리티는표준임의의 정밀 계산기.