이상한 코드/줄

이상한 코드/줄

입력하다:

21:55:40 9.68 portmap
21:55:40 7.46 Proc2
21:55:40 7.16 java
21:55:40 6.75 java
21:55:40 6.18 Proc1
21:55:40 5.95 Proc2
21:55:40 5.89 java
21:55:40 5.68 proc3
22:00:39 17.06 Proc1
22:00:39 13.00 Proc1
22:00:39 6.90 java
22:00:39 6.36 java
22:00:39 5.51 java
22:05:40 11.02 java
22:05:40 5.98 proc3
22:05:40 5.80 Proc1
22:05:40 5.37 Proc1
22:10:40 10.97 Proc1
22:10:40 10.19 Proc2
22:10:40 5.56 java
22:10:40 5.19 java
22:15:40 18.95 Proc1
22:20:40 31.89 Proc1
22:20:40 8.10 java
22:20:40 7.81 java
22:20:40 6.17 java
22:20:40 5.13 java
22:20:40 5.11 java
22:25:40 7.98 Proc2
22:25:40 6.36 java
22:25:40 5.34 java
22:25:40 5.31 java
22:30:40 8.52 Proc1
22:30:40 8.39 Proc2
22:30:40 7.29 Proc1
22:35:41 5.12 proc3
22:40:41 25.25 Proc2
22:45:40 15.82 Proc2
22:45:40 8.27 Proc1
22:50:41 19.94 Proc1
22:55:41 14.52 Proc1
23:05:41 45.58 Proc1
23:10:41 23.29 Proc2
23:10:41 5.06 java

프로세스의 시간/측정(유형별로는 javas, Proc1, Proc2 등을 의미함)당 로드(각 "유형"의 합계)가 얼마나 큰지 확인하고 싶습니다. 결국 시간별로 정렬한 다음 로드별로 정렬합니다.

따라서 예상되는 출력은 다음과 같습니다.

    $ cut -d" " -f1 input_|sort -u|while read a;do grep ^$a input_|cut -d" " -f3|sort -u|while read v;do echo $a $v $(awk -va=$a -vv=$v '$1==a&&$3==v{sum+=$2}END {print sum}' input_);done|sort -t" " -nrk3;done
21:55:40 java 19.8
21:55:40 Proc2 13.41
21:55:40 portmap 9.68
21:55:40 Proc1 6.18
21:55:40 proc3 5.68
22:00:39 Proc1 30.06
22:00:39 java 18.77
22:05:40 Proc1 11.17
22:05:40 java 11.02
22:05:40 proc3 5.98
22:10:40 Proc1 10.97
22:10:40 java 10.75
22:10:40 Proc2 10.19
22:15:40 Proc1 18.95
22:20:40 java 32.32
22:20:40 Proc1 31.89
22:25:40 java 17.01
22:25:40 Proc2 7.98
22:30:40 Proc1 15.81
22:30:40 Proc2 8.39
22:35:41 proc3 5.12
22:40:41 Proc2 25.25
22:45:40 Proc2 15.82
22:45:40 Proc1 8.27
22:50:41 Proc1 19.94
22:55:41 Proc1 14.52
23:05:41 Proc1 45.58
23:10:41 Proc2 23.29
23:10:41 java 5.06

한 줄 awk 명령으로 어떻게 작동하게 할 수 있나요?

답변1

gawk '
    { sum[$1][$3] += $2 } 
    END {
        PROCINFO["sorted_in"]="@ind_str_asc";
        for (time in sum) 
            for (process in sum[time]) 
                print time, process, sum[time][process]
        }
' file

"oneliner"의 경우 awk 본문에서 개행 문자를 제거합니다.

GNU 이외의 특정 항목:

awk '{sum[$1 OFS $3] += $2} END {for (key in sum) print key, sum[key]}' file | sort

관련 정보