awk group을 실행하는 동안 열 값 저장

awk group을 실행하는 동안 열 값 저장

다음 데이터가 포함된 입력 파일이 있습니다.

1484523745 96000 2856 25059 0  
1484523745 96000 2856 25150 0  
1484523745 4864960 2856 997962 193  
1484523745 96000 2856 24923 1  
1484523745 280000 2856 61454 12  
1484523746 1179968 2856 309430 1  
1484523746 4864960 2856 1115576 300  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 997962 116  
1484523746 96000 2856 25059 0  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 1146028 211  
1484523746 4864960 2856 1115576 371  
1484523746 3184960 2856 875340 1  

요구 사항은 열 2와 3의 고유한 조합을 기반으로 열 4와 5의 집계를 찾고, 각 고유 조합의 개수를 찾고, 열 1(에포크 시간)에서 각 고유 조합이 처음 나타나는 것을 사용하는 것입니다. 이 결과 조합. 따라서 출력은 다음과 같아야 합니다.

96000 2856 150309 1 6 1484523745  
3184960 2856 875340 1 1 1484523746  
1179968 2856 309430 1 1 1484523746  
280000 2856 61454 12 1 1484523745  
4864960 2856 5373104 1191 5 1484523745  

내 Mac PC에서는 datamash를 사용하여 한 줄 명령으로 이 작업을 쉽게 수행할 수 있습니다.

datamash -W --sort -g 2,3 sum 4,5 count 5 first 1 < inputfile

그러나 입력 파일이 위치한 Linux 프로덕션 서버에는 데이터매시가 없으므로 설치 액세스가 제한됩니다. (수천 개의 입력 파일이 있으므로 해당 파일을 Mac에 FTP로 보낼 수 없습니다.) 그래서 awk 명령을 사용하여 동일한 결과를 얻으려고 했습니다. 고유한 조합이 처음 나타나는 경우 열 1의 값을 인쇄하는 것을 제외하고는 원하는 결과를 얻었습니다.

awk -F " " '{a[$2" "$3]+=$4; b[$2" "$3]+=$5; c[$2" "$3]++} END{for(i in a)print i, a[i], b[i], c[i]}' inputfile

를 사용하여 awk열 2와 3의 각 고유 조합이 처음 발생하는 경우 열 1의 값을 어떻게 저장합니까?

답변1

배열에 키가 있는지 테스트하고 키가 없는 경우에만 업데이트할 수 있습니다.

{
    if (! ($2" "$3 in x))
        x[$2" "$3] = $1;
    a[$2" "$3]+=$4;
    b[$2" "$3]+=$5;
    c[$2" "$3]++
}
END {
    for (i in a)
        print i, a[i], b[i], c[i], x[i]
}

관련 정보