Невозможно вычислить сумму нескольких столбцов, в которых файлы данных представлены в другом формате .csv

Как вы сказали, в корневом разделе не осталось места. Очистите его, чтобы освободить место, и попробуйте еще раз. Посмотрите в /tmp /var/tmp /var/log то, что вам больше не нужно. Кроме того, проверьте, находится ли ваш каталог /home также в корневом разделе. Если да, Dropbox может занять место в корневом разделе.

0
01.01.2020, 18:42
2 ответа

Либо разделители в вашем файле несовместимы (простые |в строке заголовка, но "|"после этого )либо разделитель последовательно |, но цитирование полей непоследовательно (отсутствует открытый "на первом поле и закрытие "на последнем ).

В любом случае, когда вы устанавливаете -F'|', значения $2анализируются как строки, такие как "1.1", которые преобразуются в числовое значение, равное нулю, когда вы пытаетесь выполнить над ними сложение.

Если ваша системная версия awk поддерживает регулярные выражения для разделителя полей, вы можете вместо этого использовать -F'"?\\|"?', который позволяет литералу ()|иметь необязательные начальные и конечные кавычки:

$ awk -F'"?\\|"?' '{T+=$2} END { printf "%.2f\n", T }' demo.txt
3.30
0
28.01.2020, 02:58

Судя по ожидаемому результату, вы добавляете столбцы TAG и VAL.

Я заметил, что ваш ввод недействителен в формате CSV. Вы не можете -цитировать поля, например 12.11, или можете цитировать поля, например "12.11". Половина -их цитирование недействительно.

Два способа сделать это, в том числе избежать добавления «числовых» значений из заголовков столбцов. (Ничего из этого не тестировалось.)

(a )Определите разделитель полей, соответствующий действительности.

awk '-F"[|]"' 'NR == 1 { next; }
{ T3 += $3; T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'

(b )Исправьте каждое поле перед его использованием.

awk '-F|' 'NR == 1 { next; }
{ gsub ("\042", "", $3); T3 += $3; }
{ gsub ("\042", "", $4); T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'

Если это пример, и вы планируете сделать это для большего количества столбцов, я бы, вероятно, превратил T в массив, а сложение — в функцию:

awk '-F|' 'NR == 1 { next; }
function Sum (f) {
    gsub ("\042", "", $(f)); T[f] += $(f);
}
{ Sum(2); Sum(3); Sum(5); Sum(11); }

END {
    for (f = 1; f < 20; ++f)
        if (f in T) printf ("T%d %.2f\n", f, T[f]);
}'
0
28.01.2020, 02:58

Теги

Похожие вопросы