Удаление дубликатов по первому столбцу, но сохранение второго

Я предлагаю вам использовать утилиту tsиз пакета moreutils. Хотя его основной целью является добавление к выходным строкам метки времени, он может использовать произвольную строку вместе с меткой времени или вместо нее

.
for line in {01..05}; do echo $line; done | ts  "A string in front "
A string in front  01
A string in front  02
A string in front  03
A string in front  04
A string in front  05
-1
15.08.2020, 23:20
2 ответа

Использование GNU datamash:

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

awk с использованием ассоциативного массива 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:мы сохраняем ранее сопоставленный шаблон в удержании и ищем первое поле текущей строки в удержании и обновляем удержание, если оно найдено, или просто добавляем строку в удержание. Задержка печати в конце.

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

Perl:использует аналогичный подход, используя хэши для уникальности ключей.

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
1
18.03.2021, 23:12

Теги

Похожие вопросы