Вывести сумму строк и другое значение строки для каждого столбца в awk - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть CSV-файл, структурированный как показано ниже:

             |  Taiwan  |       |   US      |   
             |  ASUS    |   MSI |   DELL    |   HP
            ------------------------------------------
    CPU      |  50      |   49  |   43      |   65
    GPU      |  60      |   64  |   75      |   54
    HDD      |  75      |   70  |   65      |   46
    RAM      |  60      |   79  |   64      |   63
    assembled|  235     |   244 |   254     |   269

, и я должен использовать скрипт awk, чтобы напечатать сравнение между суммой цен отдельных частей компьютера (строки с 3 по 6 ) "против" цены собранного компьютера (строка 7), отображающей также страну, из которой происходит каждый бренд. Результат печати в терминале должен выглядеть примерно так:

Taiwan      Asus    245     235
Taiwan      MSI     262     244
US          DELL    247     254
US          HP      228     269

Где третий столбец - это сумма цен на CPU, GPU, HDD и RAM, а четвертый столбец - это то же значение, что и строка 7 марки каждого компьютера.

До сих пор мне удавалось суммировать отдельные столбцы, преобразующие решение, приведенное в сообщении, которое я привел ниже, но я не знаю, как я могу отобразить нужный результат в нужном формате. , Может ли кто-нибудь помочь мне с этим? В этот момент я немного отчаялся.

Суммируйте все значения в каждом столбце bash

Это содержимое исходного файла CSV, представленного в верхней части это сообщение:

,Taiwan,,US,
,ASUS,MSI,DELL,HP
CPU,50,49,43,65
GPU,60,64,75,54
HDD,75,70,65,46
RAM,60,79,64,63
assembled,235,244,254,269

Большое спасибо заранее.

1 Ответ

2 голосов
/ 05 апреля 2020
$ cat tst.awk
BEGIN { FS=","; OFS="\t" }
NR == 2 {
    for (i=2; i<=NF; i++) {
        corp[i] = (p[i] == "" ? p[i-1] : p[i]) OFS $i
    }
}
NR > 2 {
    for (i=2; i<=NF; i++) {
        tot[i] += p[i]
    }
}
{ split($0,p) }
END {
    for (i=2; i<=NF; i++) {
        print corp[i], tot[i], p[i]
    }
}

.

$ awk -f tst.awk file
Taiwan  ASUS    245     235
Taiwan  MSI     262     244
US      DELL    247     254
US      HP      228     269
...