指定された列(例では$ 2)から重複フィールド(カンマ区切り)を削除したいが、ID列(例では$ 1)が同じ場合にのみ可能です。
入力する:
A 1,2,3,4
A 8,9,10,11
A 2,3,4,11,12
B 4,5,6,7
B 6,8,9,10
予想出力:
A 1,2,3,4
A 8,9,10,11
A 12
B 4,5,6,7
B 8,9,10
答え1
{
split($2, elements, ",")
out = ""
for (i in elements) {
el = elements[i]
key = $1 " " el
if (!(key in used)) {
out = out el ","
}
used[key] = 1
}
sub(/,$/, "", out)
$2 = out
}
1
各行に対して、2番目の列をコンマで区切り、ビットを配列に格納しますelements
。次に、ループを使用してその列の新しい値を作成し、以前にその値を見たことがないかどうかを確認します。
(関連)配列から既に見た値のセットを保持しますused
。key
現在表示されている最初の列の値と2番目の列の値を含む文字列を構成します。key
にある場合は、このused
IDを以前に見たことがあるため、出力に入力しないでください。それ以外の場合は新しいIDなので、値を連結しますout
。使用しない場合は、表示される要素のセットにkey
""などのものを保存します。A 3
最後に設定されたリストをもう一度2番目の列に入れます。これは本質的に他の言語で取られるアプローチです。
上記のコードをファイルに入れるか、awk -f
単一引用符を使用してコマンドラインから引数としてすべて実行します。
答え2
perl -lpe 's/(\S+)\s+\K\S+/join ",", grep {!$seen{$1}->{$_}++} split ",", $&/e'