awk合并具有相同值的行

时间:2017-07-14 21:00:12

标签: bash awk

我正在研究一些统计数据。我有一个小时的专栏,数字表示在这个小时内这种交易发生了多少次和那种。

00 28 INFO
00 3 WARNING
01 29 INFO
01 8 WARNING
01 1 ERROR
...    

我需要有类似的东西:

hour  INFO  WARNING  ERROR
00    28    3        0
01    29    8        1
...    

ERROR行并不总是存在,所以我需要一些(如果3 $ ==" INFO"那么)。我知道它是关于数组的,但是无法使它工作。

我真的很感谢你的帮助:)。

1 个答案:

答案 0 :(得分:1)

我无法在awk中执行此操作,但我可以在bash中解决它:

# init array with 0
declare -A matrix
for ((hour=0;hour<=23;hour++)) do
    for ((type=0;type<=2;type++)) do
        matrix[$hour,$type]=0
    done
done

# read and assign values
while read -r line 
do
    hour=$(echo $line | cut -f1 -d-)
    count=$(echo $line | cut -f2 -d-)
    type=$(echo $line | cut -f3 -d-)
    case $type in
    INFO)
        matrix[$hour,0]=$count
    WARNING)
        matrix[$hour,1]=$count
    ERROR)
        matrix[$hour,2]=$count
done < "$filename"

# output
echo "HOUR\tINFO\tWARNING\tERROR"
for ((hour=0;hour<=23;hour++)) do
    echo "${hour}\t$matrix[$hour,0]\t$matrix[$hour,1]\t$matrix[$hour,2]"
done

我离电脑不远。请原谅任何可能的语法错误。