Como somar valor da coluna especificada por data específica em kornshell?

0

Estou trabalhando em uma estrutura de validação exclusiva que valida dados. Para cada trabalho de validação, há um trabalho SQL com um trabalho KSH que o acompanha (kornshell). O SQL consulta algo no banco de dados e o KSH precisa consultar o arquivo de dados usando a mesma lógica do DB (SQL).

Minha instrução SQL atual consulta a soma de uma coluna agregada por uma data que eu codifiquei e me fornece um valor. Como posso replicar isso no arquivo KSH abaixo?

Atualmente, é assim que meu código KSH está:

cat /textfile.txt | > ${OUTPUT_FILE}

Então, o que esse KSH precisa fazer é me fornecer a soma de uma coluna específica para uma data específica. Haverá vários registros para datas.

Exemplo de dados:

Date  | Money
--------------
1/1/15 : $15
2/2/15 : $14
3/3/16 : $25
etc... : etc...

Resultado esperado: Soma (Dinheiro) de 1/1/15 a 31/1/15.

    
por Nathan 20.11.2018 / 00:33

2 respostas

0

A sintaxe exata dependerá da entrada exata. Se o campo de valor sempre iniciar <space><dollar> , podemos usar uma instrução awk:

awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}'

por exemplo

awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}' testfile.txt
3/3/16 $25
2/2/15 $14
1/1/15 $15

Observação: se o caractere do separador for realmente um | e não um : , será necessário fazer awk -F'|' ... .

A maneira como isso funciona é:

$2 ~ /^ \$/ - para cada linha em que o segundo campo começa <space><dollar>

{ a[$1]+=substr($2,3)} - Adiciona o conteúdo do segundo campo (retirando os dois primeiros caracteres) a um array indexado pela data

END {for (b in a) { print b"$"a[b]}}' - quando o arquivo terminar, percorra todas as datas encontradas e imprima o total.

Portanto, basicamente, a matriz a é indexada por data e contém a soma dos valores vistos para essa data.

    
por 20.11.2018 / 00:56
0

Bem, se você precisar disso em ksh, a amostra pode ajudá-lo:

Arquivo de dados que usei:

Date  | Money
--------------
1/1/15 : $15
2/2/15 : $14
3/3/16 : $25
1/2/15 : $10
2/1/15 : $35
3/2/15 : $7

Código:

#!/bin/ksh

typeset -A SUM_ARRAY

IN_FILE="$1"

if [[ -z $IN_FILE ]]; then
        print "Usage : script.sh {input filename}"
        exit
fi


while read line;
do
        temp_array=($line)
        if [[ ! ${temp_array[0]} =~ ^(-*)$ && ${temp_array[0]} != "Date" ]]; then
                idx=$(date -d ${temp_array[0]} +"%Y%m")
                SUM_ARRAY[$idx]=$((${SUM_ARRAY[$idx]}+${temp_array[2]#\$*}))
        fi
done < $IN_FILE

print "YearMonth\tSum"

for idx in ${!SUM_ARRAY[@]}; do
        print "$idx\t\t${SUM_ARRAY[$idx]}"
done

Resultado:

YearMonth       Sum
201501          25
201502          49
201503          7
201603          25

Espero que possa ajudar

    
por 21.11.2018 / 04:23