используя либо Ksh Bash, как иметь эффективный способ - PullRequest
0 голосов
/ 20 сентября 2018
112345D000000000000129
123456D000000000000129
112345C000000000000129
123456C000000000000129
123456C000000000000126

позиция 2-6 - это номер счета

позиция 7-22 - это сумма дебета или кредита, основанная на D или C в 7-й позиции

, для суммирования кредита иДебетовое значение для каждого аккаунта было опробовано

awk '{array[substr($0,7,1)]+=substr($0,8,15)+0} END{for(i in array){print array[i]}}')"

, но, поскольку размер файла огромен, требуется больше времени, и есть способ найти его еще быстрее

MVCE

fileA содержит номер счета + другая информация

fileB содержит приведенный выше пример с дебетовым кредитом

typeset -i stbal2
typeset -i endbal2
DONE=false
until $DONE; do
read s || DONE=true
accountnumber=${s:1:10} //account number
endbal=${s:26:1}        //contain + or - sign
endbal1=${s:11:15}      //balance 

endbal2=$endbal1        //strip of leading zeros
endbal3=$endbal$endbal2 //concatenate the sign with balance

//similar process as above to get the start balance
stbal=${s:42:1}
stbal1=${s:27:15}

stbal2=$stbal1
stbal3=$stbal$stbal2

creditdebit="$(grep "${bban}" ${fileB} | awk '{array[substr($0,7,1)]+=substr($0,8,15)+0} END{for(i in array){print array[i]}}')"
set -- $creditdebit
... further logic
done < ${fileA}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

в ksh вы можете сделать что-то подобное: (myfile.txt - ваш информационный файл)

#!/bin/ksh

typeset -A Ledger

typeset -i amount

typeset -L10 Col1
typeset -L10 Col2


while read line
do
        account=${line:1:5}
        action=${line:6:1}
        amount=${line:7:21}
        if [[ $action == "C" ]]; then
                Ledger[$account]=$(( ${Ledger[$account]} + $amount ))
        elif [[ $action == "D" ]]; then
                Ledger[$account]=$(( ${Ledger[$account]} - $amount ))
        fi
done < myfile.txt


Col1="Account"
Col2="Balance"


print "$Col1$Col2\n"

for i in ${!Ledger[@]}; do
        Col1=$i
        Col2=${Ledger[$i]}
        print "$Col1$Col2"
done

На вашем примере мой вывод:

Account   Balance

12345     0
23456     126

Надеюсь, это поможет

0 голосов
/ 20 сентября 2018

Без полного MCVE это предположение, но это может быть то, что вы ищете, используя GNU awk для настоящих 2D-массивов:

$ awk '
    { tots[substr($0,7,1)][substr($0,2,5)] += substr($0,8) }
    END {
        for (type in tots) {
            for (id in tots[type]) {
                print type, id, tots[type][id]+0
            }
        }
    }
' file
C 12345 129
C 23456 255
D 12345 129
D 23456 129
...