最初の列の重複項目を削除し、2番目の列を保持します。

最初の列の重複項目を削除し、2番目の列を保持します。

2番目の列を最初の列の最初の項目にグループ化するスクリプトが必要です。

以下の例:

入力する、

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

Pythonソートされた辞書は挿入順序を維持します。

$ 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

関連情報