![첫 번째 열과 uniq만 정렬](https://linux55.com/image/62086/%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%97%B4%EA%B3%BC%20uniq%EB%A7%8C%20%EC%A0%95%EB%A0%AC.png)
다음과 같은 목록이 있습니다.
1,cat
1,dog
2,apple
3,human
나는 다음과 같은 출력을 원합니다 :
1,cat,dog
2,apple
3,human
따라서 1열의 값 1에는 2열의 cat 및 dog 값이 포함됩니다. 가능합니까?
답변1
첫 번째 열이 엄격하게 정렬되었다고 가정합니다.
$ awk -F, '$1==last {printf ",%s",$2;next} NR>1{print""} {last=$1;printf "%s",$0} END{print""}' file
1,cat,dog
2,apple
3,human
또는 입력 라인의 순서는 제한되지 않습니다(출력 라인의 순서는 보장되지 않습니다).
$ awk -F, '{a[$1]=a[$1]","$2} END{for (i in a)print i a[i]}' file
1,cat,dog
2,apple
3,human
답변2
펄에서는:
$ perl -F',' -lane 'push @{$k{$F[0]}},@F[1..$#F];
END{$,=",";print $_,@{$k{$_}} for keys(%k)}' file
2,apple
1,cat,dog
3,human
또는 정렬된 출력의 경우:
$ perl -F',' -lane 'push @{$k{$F[0]}},@F[1..$#F];
END{$,=",";print $_,@{$k{$_}} for sort keys(%k)}' file
1,cat,dog
2,apple
3,human
이는 여러 필드를 처리할 수 있다는 장점이 있습니다. 모든 행에 필드가 2개만 있는 경우 다음과 같이 단순화할 수 있습니다.
perl -F',' -lane 'push @{$k{$F[0]}},$F[1];
END{$,=",";print $_,@{$k{$_}} for sort keys(%k)}' file