파일의 금액 합계는 쉘 변수에 단일 값으로 저장되어야 합니다.

파일의 금액 합계는 쉘 변수에 단일 값으로 저장되어야 합니다.
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유틸리티는표준임의의 정밀 계산기.

관련 정보