Bash를 사용하여 모든 트랜잭션을 기록하는 방법

Bash를 사용하여 모든 트랜잭션을 기록하는 방법

직불, 신용 및 인출 거래가 포함된 파일이 있습니다. 각 거래 후 잔액을 기록하려면 bash 스크립트가 필요합니다. 따라서 파일은 다음과 같습니다.

D:11/02/12:1000.50
C:11/03/12:300
W:11/05/12:95.50
D:11/10/12:125
C:11/20/12:265.50

여기서 D = 차변, C = 대변, W = 인출

출력은 다음과 같아야 합니다.

11/02/12 1000.50
11/03/12 700.50
11/05/12 605.00

등. 에서 작성했는데 awk어떻게 작성하는지 모르겠습니다 bash. 어떤 제안이나 샘플이라도 대단히 감사하겠습니다.

답변1

간단하고 스마트하게 유지하세요

#!/usr/bin/env bash
D_amt=0

[[ $# -eq 0 ]] && { echo -e "Usage\n\t $0 input_file"; exit 1; }

while IFS=':' read type Date amt
do
        case $type in
                D)      D_amt=$( echo $amt + $D_amt | bc ) 
                        echo $Date $D_amt && continue ;;

                C|W)    D_amt=$( echo $D_amt - $amt| bc) 
                        echo $Date $D_amt && continue ;;
        esac

done <$1

답변2

첫 번째 질문은 bash에서 이 작업을 수행하는 것이 적합한지 여부에 대한 답변을 받아야 합니다. 실제로 작동하는 해결책이 있는 것 같기 때문에 더 의심스럽습니다. awk는 사용할 수 없지만 bash는 안정적으로 사용할 수 있는 곳은 어디입니까? 이게 숙제야...?

그러나 그것을 수행하는 방법에 관해서는: 이것은 실제로 부동 소수점 수학이 아니라 두 자리 후위 정밀도를 사용하는 고정 소수점 수학입니다. 따라서 숫자를 두 자리만큼 이동하고 수학을 수행한 후 결과를 다시 이동하십시오.

shift_100_left () {
  local input output beforep afterp
  input="$1"
  if [ "$input" = "${input//./_}" ]; then
    # no . in it
    output="${input}00"
  else
    beforep="${input%.*}"
    afterp="${input#*.}"
    output="${beforep}${afterp}"
  fi
  output=${output#0}
  output=${output#0}
  echo "$output"
}
shift_100_left 100
shift_100_left 123.75

shift_100_right () {
  local input output beforep afterp length
  input="$1"
  length=${#input}
  if [ 1 -eq "$length" ]; then
    output=0.0${input}
  elif [ 2 -eq "$length" ]; then
    output=0.${input}
  else
    beforep="${input%??}"
    afterp="${input:$((length-2))}"
    output="${beforep}.${afterp}"
  fi
  echo "$output"
}
shift_100_right 1
shift_100_right 12375

이는 모든 숫자가 xxx 또는 yyy.yy처럼 보이지만 결코 zzz.z와 같지 않다고 주장합니다.

관련 정보