Если первая строка вашего 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
Мое решение работает как шарм
Для этого набора ДАННЫХ 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