Подсчитать значение в столбце по часам и добавить заголовок - PullRequest
0 голосов
/ 28 ноября 2018

В столбце 3 значение часа, я хочу напечатать заголовок от 0 до 23 часов и посчитать в столбце 3 время, повторяемое часом.Если значение hr не найдено, выведите 0.

Входной файл

123 3 3
122 3 3
122 4 4
122 3 4
122 4 4
122 5 5
122 3 12
122 4 15
122 5 20
122 5 20

Требуемый вывод

Первая строка= Заголовок от 0 до 23 часов, разделенный,

Вторая строка = Найденные значения для каждого часа. Если не найдено значение, выведите 0.

0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23
0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0

Для подсчета по часам,Я пробовал

awk '{a[$3]++} END {for(i in a) print i, a[i]}'

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

еще awk

$ awk '{a[$3]++} 
    END{while(i<24) 
          {h1=h1 s i+0; 
           h2=h2 s a[i++]+0; 
           s=","} 
        print h1 ORS h2}' file

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0

пс.выглядит как вариант ответа @ JamesBrown.

0 голосов
/ 28 ноября 2018

Немного измените цикл for:

for(i in a) print i, a[i]

Кому:

for(i=0; i<=23; i++) print i, a[i]+0

Транспонируйте выход с помощью rs:

awk ... | rs -c' ' -T

Выход:

0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23
0   0   0   2   3   1   0   0   0   0   0   0   1   0   0   1   0   0   0   0   2   0   0   0

Если вы уверены в выводе csv, используйте tr в конце:

awk '{a[$3]++} END {for(i=0;i<=23;i++) print i, a[i]+0}' | rs -c' ' -T | tr -s ' ' ,

Выход:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
0 голосов
/ 28 ноября 2018
$ awk '
{ a[$3]++ }                              # hash them
END {
    for(i=0;i<=23;i++) {                 # loop the hours
        b=b (b==""?"":",") i             # collect hours to b
        c=c (c==""?"":",") (a[i]?a[i]:0) # and counts to c
    }
    print b ORS c                        # output them
}' file
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
0 голосов
/ 28 ноября 2018

Не могли бы вы попробовать следующее.

awk '
BEGIN{
  OFS=","
  for(i=0;i<=23;i++){
     printf("%d%s",i,i==23?ORS:OFS)
  }
}
{
  a[$3]++
}
END{
  for(j=0;j<=23;j++){
     printf("%d%s",a[j],j==23?ORS:OFS)
  }
}'   Input_file

Вывод будет следующим.

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
0,0,0,2,3,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...