열 값을 기준으로 CSV의 행을 집계하는 방법

열 값을 기준으로 CSV의 행을 집계하는 방법

내 입력은 다음과 같이 정렬된 CSV 파일입니다( :일반적인 쉼표 대신 필드 구분 기호로 사용됨).

version:device
1.0.0:dev1
1.0.0:dev2
1.2.3:dev3
1.3.4:dev4
1.3.4:dev5

각 버전이 한 행에 있도록 집계하고 싶습니다.

version:devices
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

답변1

GNU를 사용하여 datamash콜론으로 구분된 첫 번째 필드로 그룹화하고 두 번째 필드를 축소합니다.

$ datamash -t : groupby 1 collapse 2 <file
version:device
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

답변2

매우 놀라운 도구입니다.

mlr --csv --fs : group-by version then nest --ivar , -f device file.csv
version:device
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

답변3

노력하다

awk -F: '$1 == before { printf ",%s",$2 ; } 
         $1 != before { printf "%s%s",nl,$0 ; before=$1 ; nl="\n" } 
         END {printf nl ; }' 

어디

  • -F::awk에게 구분 기호 로 사용하도록 지시
  • printf"\n"tol( ) 이 아니면 개행 문자를 인쇄하지 마세요 .
  • 이는 한 줄(예 awk -F: '....' file: )일 수 있습니다. 가독성을 위해 줄을 구분했습니다.

nl이는 두 개의 변수를 사용하여 새 행( )과 이전 행 의 값을 보유합니다 $1.

답변4

awk -F: -v OFS=: '
    NR == 1{print;next} 
    !v {v=$1;d=$2;next} 
    v == $1 {d = d","$2}
    v != $1 {print v,d;v=$1;d=$2}
    END{print v,d}
' file

관련 정보