按第一列删除重复项但保留第二列

按第一列删除重复项但保留第二列

我需要一个脚本,将第二列分组到第一列的第一次出现。

下面的例子:

输入,

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

awkb使用在计数器上索引的关联数组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:我们将先前匹配的模式存储在hold中,并在hold中查找当前行的第一个字段,如果找到则更新hold,或者简单地将行追加到hold中。打印在 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

相关内容