내 입력은 다음과 같이 정렬된 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