#linux #bash #csv
#linux #bash #csv
Вопрос:
У меня есть файл CSV с:
block_num,date_time,miner_wallet,rewards,finished,verified
133,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,7,6
134,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,2,2
135,2019-02,0xd1dacf164f4bed77c37a26a79e9d63606cc35c82,0.0,7,6
135,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,7,7
136,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,3,3
136,2019-02,0xd1dacf164f4bed77c37a26a79e9d63606cc35c82,0.0,4,4
137,2019-02,0xa57d8b10d0186abf946f9b6a2709c680970fdd39,0.0,1,1
Мне нужно вычислить каждый одинаковый «miner_wallet» для одного вывода с адресом майнера и суммой последнего поля «проверено» и умножить на 4, поэтому вывод для будет:
0x212eccf2cccdecb1880e058ec40b21dd36f47c85 72
0xd1dacf164f4bed77c37a26a79e9d63606cc35c82 40
0xa57d8b10d0186abf946f9b6a2709c680970fdd39 4
используя bash, awk или любой другой простой способ…
Комментарии:
1. «или любым простым способом …» -> В PowerShell это было бы
ipcsv data.csv | group miner_wallet | select name, @{n='check'; e={($_.group | measure verified -sum).sum * 4}} | epcsv out.csv -notype
Ответ №1:
Это довольно легко сделать с awk
. Предполагая, что ваша первая строка в вашем файле — это строка заголовка, которую вы показываете, что ее просто нужно пропустить, вы можете сделать:
$ awk -F, '{ if (NR == 1) next; w[$3] = $6 * 4}
END { for (i in w) print i, w[i]}' file
0x212eccf2cccdecb1880e058ec40b21dd36f47c85 72
0xa57d8b10d0186abf946f9b6a2709c680970fdd39 4
0xd1dacf164f4bed77c37a26a79e9d63606cc35c82 40
Объяснение
awk -F,
установите разделитель полей как','
'{ if (NR == 1) next;
если номер строки1
, перейдите к следующей строке, чтобы пропустить заголовок,w[$3] = $6 * 4}
установите ассоциативный массивw[miner_wallet] = verified * 4
END { for (i in w) print i, w[i]}'
выведите индексы массива и итоговые значения.
Комментарии:
1. Оба ответа по существу идентичны. Единственное различие заключается в именах переменных, где они инициализируются и где выполняется проверка
NR
.awk
это потрясающий инструмент. Стоит изучить..
Ответ №2:
awk 'BEGIN{FS=","} NR>1 {map[$3] =$6;} END{for (key in map) {print key " " map[key] * 4;}}' i.csv
0x212eccf2cccdecb1880e058ec40b21dd36f47c85 72
0xa57d8b10d0186abf946f9b6a2709c680970fdd39 4
0xd1dacf164f4bed77c37a26a79e9d63606cc35c82 40
Где FS
— разделитель полей, map
— хэш-карта для хранения суммы для каждого кошелька и NR>1
пропускает первую строку с заголовками.