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