다른 열을 기반으로 파일에서 열 가져오기

다른 열을 기반으로 파일에서 열 가져오기

아래와 같이 약 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

관련 정보