다음과 같은 파일이 있습니다.
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