Проанализируйте файл CSV и вычислите те же данные по определенной формуле

#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 пропускает первую строку с заголовками.