Рассмотрите использование инструментов, таких как splunk, loglogic, logrhythm, graylog2.org (открытый исходный код)
Сначала убедитесь, что Вы настроили $temp
переменная правильно:
$ temp="abc,1,2,3,4,5,6"
$ echo "$temp"
abc,1,2,3,4,5,6
Я использовал следующий подход, чтобы сделать это:
$ echo "$temp" | tr ',' '\n' | grep -v abc | awk '{sum+=$1};END{print sum}'
21
Относительно Вашего подхода Вы забыли печатать массивы, которые Вы накопили с END{...}
блок:
$ echo "$temp" | awk '{split($0,a,","); name=a[1]
for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }
END{print sum1; print sum2}'
6
15
Awk не имеет метода для введения результатов назад в оболочку родителя от того, где это назвали, таким образом, необходимо будет стать немного лукавыми и сохранить, это - результаты к массиву в Bash.
$ myarr=($(echo "$temp" | awk '{split($0,a,","); name=a[1]
for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }
END{ print sum1; print sum2}'))
Вышеупомянутое делает это:
$ myarr=($(...awk command...))
Это приведет к Вашим значениям от sum1
и sum2
быть сохраненным в массив $myarr
.
Они доступны как так:
$ echo "${myarr[@]}"
6 15
$ echo "${myarr[0]}"
6
$ echo "${myarr[1]}"
15
Попробуйте это:
$ awk -F',' 'BEGIN{OFS="\t";print "Name","Sum1","Sum2"}
{print $1,$2+$3+$4,$5+$6+$7}' sample.csv
Name Sum1 Sum2
abc 6 15
de 15 14
xyz 14 17
Нет никакой потребности в Вашем цикле удара, можно выполнить во всем awk
. -F
опция позволяет Вам определять разделитель поля ввода в этом случае ,
, таким образом, Вы не должны явно разделять строку. С тех пор awk
файлы чтений линию за линией, Вы также не должны читать файл в bash
.
BEGIN{}
блок выполняется прежде, чем считать первую строку и просто печатает заголовок и устанавливает выходной разделитель (OFS
) к вкладке. Так как поля уже разделяются, все, что необходимо сделать, подводят итог полей 2-4 и 5-7 и печатают их для каждой строки.
bash
и awk
не совместно используйте переменные. Ваш sum1
в ударе абсолютно независимо от sum1
в awk
.
– terdon♦
16.09.2013, 18:59
Bash
#!/usr/bin/env bash
printf "%-5s\t%s\t%s\n" Name Sum1 Sum2
while IFS=, read -a Arr
do
(( Grp1 = Arr[1] + Arr[2] + Arr[3] ))
(( Grp2 = Arr[4] + Arr[5] + Arr[6] ))
printf "%-5s\t%d\t%d\n" ${Arr[0]} $Grp1 $Grp2
done < input.txt
Вывод
root@ubuntu:~# bash parse.sh
Name Sum1 Sum2
abc 6 15
de 15 14
xyz 14 17
Благодаря @1_CR для арифметических приемов для элемента массива
((Grp1 = Arr[1] + Arr[2] + Arr[3]))
вместо Grp1=$(( ${Arr[1]} + ${Arr[2]} + ${Arr[3]} ))
– iruvar
16.09.2013, 19:25
Grp=(( Arr[1] + Arr[2] + Arr[3] ))
но теперь я изучаю спасибо
– Rahul Patil
16.09.2013, 19:27
Arr=( ${line//,/ } )
шаг при помощи while IFS=, read -a Arr
вместо while read line
– iruvar
16.09.2013, 22:31