2017-01-17 4 views
1

필자는 열 1,3 개를 합산하여 7 개를 합산하고 개수를 가져 와서 최신 datetime (열 6)을 갖는 열 4와 5를 가져와야한다는 파일을 가지고 있습니다.그룹 열을 그룹화하고 셸에서 특정 값 가져 오기

file.txt를

AAA,BBB,CCC,OOO,PPP,20170117012006,12 
XXX,YYY,MMM,OOO,PPP,20170117012006,13 
AAA,BBB,CCC,III,TTT,20170117020006,14 
XXX,YYY,MMM,OOO,PPP,20170117022067,10 

예상 출력

AAA,BBB,CCC,III,TTT,26,2 
XXX,YYY,MMM,OOO,PPP,23,2 

여기 만 그룹 열 1,2,3 코드가 있습니다.

awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[$1,$2,$3]+=$7 }{arr2[$1,$2,$3]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt 

답변

0

추가 배열을 사용하여 각 그룹에 대한 최신 정보를 보유하십시오.

awk 'BEGIN { FS=OFS=SUBSEP="," } 
    { 
     arr[$1,$2,$3]+=$6; 
     arr2[$1,$2,$3]++; 
     if ($6 > latest[$1,$2,$3]) { 
      latest[$1,$2,$3] = $6; 
      latest_data[$1,$2,$3] = $4 OFS $5; 
     } 
    } 
    END {for (i in arr) print i,arr[i],arr2[i],latest_data[i]}' FILE.txt 
0
awk -F"," '      
{ 
    i=$1","$2","$3 
    if (i in a) { 
     split(a[i],r,",") 
     $7+=r[4]      
     c=r[5]+1     
     if (r[1] > $6) { $4=r[2]; $5=r[3]; $6=r[1] } 
    } else { c=1 } 

    a[$1","$2","$3]=$6","$4","$5","$7","c 

} END { for (i in a) { print i substr(a[i],15) }} 
' file 

AAA,BBB,CCC,III,TTT,26,2 
XXX,YYY,MMM,OOO,PPP,23,2 

당신이 열 정렬 1,2 & 3, 다음이 대신

User101 @
END { asorti(a,b); for (i in b) { print b[i] substr(a[b[i]],15) }} 
0

를 사용하려는 경우 : 다음을 시도, 같은과 함께/예상 요청 된 출력을 줄 것이다 $ 1, $ 2, $ 3의 시퀀스는 Input_file과 동일합니다.

awk -F, 'FNR==NR{A[$1,$2,$3]=A[$1,$2,$3]?A[$1,$2,$3]+$7:$7;;B[$1,$2,$3]++;next} (($1,$2,$3) in A){$NF="";print $0 A[$1,$2,$3] "," B[$1,$2,$3];delete A[$1,$2,$3]}' OFS=, SUBSUP=, Input_file Input_file 

필드 구분 기호를 ","로 지정하십시오. 매우 첫 번째 파일을 읽을 때 FNR == NR은 TRUE가됩니다. 인덱스가 $ 1, $ 2, $ 3 인 A라는 배열을 생성하고 $ 7의 값을이 배열에 연결합니다. $ 1, $ 2, $ 3의 개수를 취하기 위해 인덱스가 $ 1, $ 2, $ 3 인 B라는 배열을 하나 더 만듭니다.

그렇다면 첫 번째, 두 번째, 세 번째 필드가 배열 A에 있는지 확인한 다음 배열 A와 (와) 함께 현재 줄 (마지막 필드는 NULL로 설정)을 인쇄하십시오. 요청에 따라 B의 값을 배열합니다.

편집 : 솔루션 중 하나가 아닌 라이너 형태를 성공적으로 추가했습니다.

awk -F, 'FNR==NR{ 
       A[$1,$2,$3]=A[$1,$2,$3]?A[$1,$2,$3]+$7:$7; 
       B[$1,$2,$3]++; 
       next 
       } 
       (($1,$2,$3) in A){ 
             $NF=""; 
             print $0 A[$1,$2,$3] "," B[$1,$2,$3]; 
             delete A[$1,$2,$3] 
           } 
     ' OFS=, SUBSUP=, Input_file Input_file