아래와 같이 약 500만 개의 레코드가 포함된 파일이 있습니다.
1223423,21,foo,data1,data2,data3,data4,data5,45,267,index1
4234234,34,bar,cat1,cat2,cat3,cat4,cat5,34,2323,index2
325423,23,foo,data1,data2,data3,data4,data5,23,1232,index3
2131,23,bar,cat1,cat2,cat3,cat4,cat5,22,4334,index4
1231,43,cat,val1,val2val3,val4,val5,96,4598,index5
4596,87,cat,val1,val2val3,val4,val5,08,234,index6
원하는 출력:
foo,data1,data2,data3,data4,data5 : index1,index3
bar,cat1,cat2,cat3,cat4,cat5 : index2,index4
cat,val1,val2val3,val4,val5 : index5,index6
답변1
작동한다면 이것을 시도하십시오
awk -F, '{a[$3$4$5$6$7$8]++;if(a[$3$4$5$6$7$8] > 1)k[$3$4$5$6$7$8]=k[$3$4$5$6$7$8]","$11;else k[$3$4$5$6$7$8]=$3","$4","$5","$6","$7","$8":"$11}'END'{for(i in k) print k[i]}' data
온라인으로 질문이 있습니다
4596,87,cat,val1,val2val3,val4,val5,08,234,index6
val2val3
?? 사이에 쉼표(,)가 없습니다. 맞나요?
답변2
매우 큰 파일의 경우 일반적으로 데이터를 정렬하여 나머지가 더 쉽고 메모리가 필요하지 않도록 하는 것이 좋습니다. sort는 매우 큰 데이터 세트를 처리하도록 설계되었습니다.
아래에서는 불필요한 열을 제거하고 데이터를 정렬한 다음 awk는 여러 행을 기억할 필요 없이 단순히 중복 열을 억제합니다. 최종 정렬은 인덱스를 순서대로 유지하기 위한 선택 사항입니다.
cut -d, -f 3-8,11 |
sort |
awk -F, '
{ new = sprintf("%s,%s,%s,%s,%s,%s",$1,$2,$3,$4,$5,$6)
if(new==last)printf ",%s",$7
else{ printf "%s%s: %s",newline,new,$7
last = new
newline = "\n"
}
}
END{printf "\n"}
' |
sort -t: -k 2
답변3
awk
파일을 읽으면서 메모리에 배열을 만든 다음 필요에 따라 배열을 종료하여 출력 할 수 있습니다 .
그러나 레코드에서 처음 2개와 마지막 3개 필드를 제거한 후에도 배열의 키가 되는 필드가 여전히 많이 있습니다.
awk -F, '{ ix=$NF
sub( "[^,]+,[^,]+,","") # delete first 2 fields
sub(",[^,]+,[^,]+,[^,]+$","") # delete last 3 fields
a[$0]=a[$0] ","ix }
END{ for( r in a ) { sub(",","",a[r]); print r" : "a[r] }
}' file
산출:
cat,val1,val2val3,val4,val5 : index5,index6
bar,cat1,cat2,cat3,cat4,cat5 : index2,index4
foo,data1,data2,data3,data4,data5 : index1,index3