2개의 열을 기준으로 필드를 병합하고 합산하는 방법

2개의 열을 기준으로 필드를 병합하고 합산하는 방법

다음과 같은 파일이 있습니다.

Bitrate        ASNUM       TotalBytes    DownloadTime   NumberCount

280000          2856        61454           12

280000          2856        61428           14

1179968         2856        309430          11

1179968         4156        309200          15

4864960         2856        997962          193 

4864960         2856        1115576         300

4864960         2856        997962          116

처음 2개 열(예: 비트 전송률 및 ASNUM)을 기반으로 행을 병합하고 이에 해당하는 총 바이트 및 다운로드 시간 필드를 추가해야 합니다.

결과 출력은 다음과 같아야 합니다.

Bitrate        ASNUM      TotalBytes     DownloadTime   NumberCount 

280000          2856        122882          26               2  

1179968         2856        309430          11               1

1179968         4156        309200          15               1

4864960         2856        3111500         609              3  

추가 열 NumberCount는 발생 횟수를 나타냅니다.

이 기능을 달성할 수 있는 코드를 구현하는 데 도움을 줄 수 있습니까?

답변1

awk를 사용하는 솔루션은 다음과 같습니다.

awk -F " " '
    NR==1 {print; next} 
    NF {a[$1" "$2]+=$3; b[$1" "$2]+=$4; c[$1" "$2]++} 
    END {for(i in a)print i, a[i], b[i], c[i]}
' file

--> inputFile은 명령이 실행되는 디렉터리에 있어야 합니다.

--> -F " "는 단일 공백을 구분 기호로 간주합니다.

--> NR==1{print;next} 출력할 제목을 인쇄하고 건너뜁니다.

--> 배열 a[$1" "$2]는 첫 번째 열 값과 두 번째 열 값의 그룹화 기준을 고려합니다. 배열 b와 c는 동일합니다.

--> += 연산자는 배열 그룹화에 따라 필요한 열을 합산합니다.

--> 배열 c와 함께 사용되는 ++ 연산자는 그룹 수를 저장합니다.

-->마지막 "for" 루프는 출력 결과를 인쇄하는 데 사용됩니다.

답변2

GNU 데이터 혼합이러한 작업을 위해 설계되었습니다.

datamash -WH -g 1,2 sum 3,4 count 4

아니면 좀 더 자세히

datamash --whitespace --headers \
  groupby Bitrate,ASNUM sum TotalBytes,DownloadTime count DownloadTime

(어떤 비그룹화 필드를 지정하는지는 중요하지 않습니다 count.)

빈 줄로 인해 상황이 약간 복잡해집니다. 하지만 이전에 빈 줄을 제거하고 나중에 다시 추가하면 됩니다.

sed '/^$/d' file | datamash -WH -g 1,2 sum 3,4 count 4 | column -t | sed G
GroupBy(Bitrate)  GroupBy(ASNUM)  sum(TotalBytes)  sum(DownloadTime)  count(DownloadTime)

280000            2856            122882           26                 2

1179968           2856            309430           11                 1

1179968           4156            309200           15                 1

4864960           2856            3111500          609                3

관련 정보