Как вычислить сумму нескольких столбцов с плавающей запятой

Если первая строка вашего CSV-файла верна, следующий код будет работать.

awk  'NR==1{printf "%s",$0; gsub(/[^|]/,""); nlast=n=length($0); next;} nlast==n{printf "\n";nlast=0} {printf "%s",$0; gsub(/[^|]/,""); nlast+=length($0)} END{print ""}'  file_201805072030.csv > temp.csv && mv -f temp.csv file_201805072030.csv

если ни одна из строк неверна, и если вы хотите изменить порядок с 5 столбцами

awk  'NR==1{printf "%s",$0; gsub(/[^|]/,""); nlast=n=4; next;} nlast==n{printf "\n";nlast=0} {printf "%s",$0; gsub(/[^|]/,""); nlast+=length($0)} END{print ""}' file_201805072030.csv > temp.csv && mv -f temp.csv file_201805072030.csv
0
01.01.2020, 09:42
1 ответ

Мое решение работает как шарм

Для этого набора ДАННЫХ 1 -проверено на этом

ID|NAME|SAL|COST|PER|TAG
1"|"A"|"50.1123"|"10.1"|"25.22"|"10.2"|"
2"|"B"|"50.11"|"15.45"|"25.1"|"10.1118"|"

Для этого набора ДАННЫХ 2 -проверено на этом

ID|NAME|SAL|COST|PER|TAG
1|A|9.234|123.12|20.123|67.1
2|B|10.12|153.234|20.90|190.34
3|C|8.234|17.01|25.777|80.09
4|D|11.2|11.222|10.1|10.00000
5|E|16.23|10.1|145.22|11.77278

Эффективное решение

FILE_NAME="$1"
COLUMN_NAME="$2"

alpha=( $(awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /'$COLUMN_NAME'/){print i;}}}' $FILE_NAME) )

for each in "${alpha[@]}"
do
      #echo "$each"
      awk -F'"?\\|"?' '{T+=$('$each')} END { printf "%.4f\n", T }' $FILE_NAME
done

Беги вот так

bash script.sh DEMO.txt 'SAL|COST|PER|TAG'

выход 1:

100.2223
25.5500
50.3200
20.3118

выход 2:

55.0180
314.6860
222.1200
359.3028
0
28.01.2020, 02:58

Теги

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