Bash массив, созданный из файла, не будет создавать строковый индекс - PullRequest
0 голосов
/ 13 февраля 2020

Я читаю из файла в массив, используя while l oop, и пытаюсь создать ключ, используя первое значение столбца из файла, который является строкой. Это не работает, и все, что я получаю, это значение ключа 0. Если я решу использовать столбец, содержащий цифры, ключ создается без проблем.

Вот как выглядит входной файл. В столбце col1 есть еще много строк и других значений:

AING,AING1759342196,00002570,0007816,20087120
AING,AING4392227425,00003550,0009948,35315400
AING,AING4861992028,00001760,0004552,8011520
AING,AING4995735686,00004550,0009858,44853900
AING,AING5727938304,00004870,0007298,35541260
AING,AING5919379575,00002220,0003603,7998660
AING,AING6374702721,00004640,0009451,43852640
AING,AING6434550362,00003000,0002409,7227000
AING,AING8139382011,00003450,0007461,25740450
AING,AING8175209012,00003330,0006350,21145500
BANK,BANK2329856527,00003830,0009947,38097010...

Это сценарий, который я использую:

unset c1 c2 c3 c4 c5 sumVol sumTurn

while IFS=, read c1 c2 c3 c4 c5; do c4=`echo $c4|sed 's/^0*//'`; echo $c1 $c2 $c3 $c4 $c5; ((sumTurn[$c1]+=c5)); ((sumVol[$c1]+=c4)); done < inputFile.csv

for i in ${!sumTurn[@]}; do echo $i,${sumTurn[$i]}; done

И полученный результат выглядит следующим образом:

0,759144390

... которая является суммой столбца 5, которую я действительно хочу разделить по ключам, которые должны использоваться в столбце 1. Если я заменю ключевой столбец sumVol на столбец 4, цифра c, он создает массив, но, очевидно, это не то, что мне нужно!

427,956480
639,1361070
1033,4090680
1422,1948140
1847,4968430
...

Может кто-то указать, что я делаю неправильно?

Спасибо

Стюарт

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Почему это так?

cat input.csv
AING,AING1759342196,00002570,0007816,20087120
AING,AING4392227425,00003550,0009948,35315400
AING,AING4861992028,00001760,0004552,8011520
AING,AING4995735686,00004550,0009858,44853900
AING,AING5727938304,00004870,0007298,35541260
AING,AING5919379575,00002220,0003603,7998660
AING,AING6374702721,00004640,0009451,43852640
AING,AING6434550362,00003000,0002409,7227000
AING,AING8139382011,00003450,0007461,25740450
AING,AING8175209012,00003330,0006350,21145500
BANK,BANK2329856527,00003830,0009947,38097010

awk 'BEGIN{FS=OFS=","}{a[$1]+=$5}END{ for (i in a) print i,a[i]}' input.csv

output

BANK,38097010
AING,249773450

Хотя неясно, что вы делаете с колонкой 4 (например), но я думаю, что вы все равно получить идею

0 голосов
/ 13 февраля 2020

Вам просто нужно declare sumTurn et c. как ассоциативный массив : declare -A sumTurn sumVol

...