첫 번째 열의 중복 항목을 제거하고 두 번째 열은 유지합니다.

첫 번째 열의 중복 항목을 제거하고 두 번째 열은 유지합니다.

두 번째 열을 첫 번째 열의 첫 번째 항목으로 그룹화하는 스크립트가 필요합니다.

아래 예:

입력하다,

A,1
A,2
B,1
D,1
A,3
B,2

산출,

A,1,2,3
B,1,2
D,1

답변1

사용GNU 데이터 혼합:

$ datamash -st, -g 1 collapse 2 < input.csv
A,1,2,3
B,1,2
D,1

답변2

b카운터에 인덱싱된 연관 배열 nukes(지금까지 본 고유 키 수를 나타냄)과 a출력할 실제 데이터를 보유하는 연관 배열을 사용합니다. 배열 b의 목적은 배열 a의 키에 순서를 부여하는 것입니다. OTW, 액세스할 때 무작위 순서를 얻습니다(END 블록에서 인쇄할 때).

$ awk -F ',' '
(newkey = !($1 in a)) {
  b[++nukes] = $1
}
{
  a[$1] = (newkey ? $1 : a[$1]) FS $2
}
END {
  for (i=1; i<=nukes; ++i) {
    print a[b[i]] 
  }
}
' your_file

파이썬정렬된 사전은 삽입 순서를 유지합니다.

$ python3 - your_file <<\eof
import sys 
from collections import OrderedDict
h = OrderedDict()
with open(sys.argv[1]) as f:
  for l in f:
    for k, v in [l.rstrip('\n').split(',')]:
      h[k] = (h[k] if k in h else k) + ',' + v
print(*list(h.values()), sep='\n') 
eof

GNU sed: 이전에 일치된 패턴을 보류에 저장하고 보류 중인 현재 행의 첫 번째 필드를 찾고, 발견되면 보류를 업데이트하거나 단순히 보류할 행을 추가합니다. 인쇄는 eof에서 진행됩니다.

$ sed -Ee 'G
  /^([^,]+)(,[^\n]+)\n((.*\n)?\1,[^\n]+)/{s//\3\2/;$q;h;d;} 
  s/\n.*//;H;1h;$!d;x
' your_file

진주: 해시를 사용하여 키를 고유화하는 유사한 접근 방식을 취합니다.

perl -F, -lane '
  my($k, $v) = @F;
  my $seen = exists $h{$k};
  ($h[@h], $v) = ($k, $_) if ! $seen;
  push @{$h{$k}}, $v}{$,=",";
  print @{$h{$_}} for @h;
' your_file

관련 정보