Подведение итогов массива в awk?

Рассмотрите использование инструментов, таких как splunk, loglogic, logrhythm, graylog2.org (открытый исходный код)

6
14.04.2019, 12:08
3 ответа

Установка $temp

Сначала убедитесь, что Вы настроили $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.

Доступ к $myarr массива

Они доступны как так:

$ echo "${myarr[@]}"
6 15

$ echo "${myarr[0]}"
6

$ echo "${myarr[1]}"
15
6
27.01.2020, 20:20
  • 1
    Я должен распечатать наклон массивов, я храню его для более позднего использования? –  user2179293 16.09.2013, 18:36
  • 2
    И abc не фиксируется, Это был просто пример –  user2179293 16.09.2013, 18:36
  • 3
    @user2179293 - любой ценой, уверенный, что можно на потом сохранить их. –  slm♦ 16.09.2013, 18:37
  • 4
    @user2179293 - да изменяют, как действительно необходимый, просто показывал Вам один путь. –  slm♦ 16.09.2013, 18:37
  • 5
    Но это не работает, я имею в виду, делают мне нужен КОНЕЦ –  user2179293 16.09.2013, 18:40

Попробуйте это:

$ 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 и печатают их для каждой строки.

11
27.01.2020, 20:20
  • 1
    Да Ваше предложение работает, но я все еще должен знать, почему мой код не работает –  user2179293 16.09.2013, 18:58
  • 2
    @user2179293, это не работает потому что 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 для арифметических приемов для элемента массива

3
27.01.2020, 20:20
  • 1
    Вы могли, вероятно, сделать это более читаемым при помощи арифметической оценки, а не арифметического расширения. Так ((Grp1 = Arr[1] + Arr[2] + Arr[3])) вместо Grp1=$(( ${Arr[1]} + ${Arr[2]} + ${Arr[3]} )) –  iruvar 16.09.2013, 19:25
  • 2
    , хм Хороший для знания этого.. Я столкнулся с проблемой, когда я пробовал Grp=(( Arr[1] + Arr[2] + Arr[3] )) но теперь я изучаю спасибо –  Rahul Patil 16.09.2013, 19:27
  • 3
    @1_CR, я обновил это.. теперь кажется мне более читаемым.. :) –  Rahul Patil 16.09.2013, 19:30
  • 4
    В то время как Вы в нем, можно пропустить Arr=( ${line//,/ } ) шаг при помощи while IFS=, read -a Arr вместо while read line –  iruvar 16.09.2013, 22:31

Теги

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