Подсчет дубликатов в определенном столбце с использованием perl / linux - PullRequest
2 голосов
/ 27 января 2012

У меня есть файл (с разделителями табуляции) с 6 столбцами (здесь я показал 2 столбца для простоты)

46_#1   A   
47_#1   B   
49_#1   C   
51_#1   D   
51_#1   E

Я хочу подсчитать дубликаты в первом столбце (только счетчик без удаления) и сохранить счетчик в следующем столбце. Таким образом, вывод должен быть -

46_#1   1  A    
47_#1   1  B    
49_#1   1  C    
51_#1   2  D    
51_#1   2  E

Я использовал команду linux-

uniq -c  file

но это займет целую строку (не 1-й столбец), тогда я использовал

uniq -c -w5 file

Но количество слов в первом столбце может варьироваться.

Может кто-нибудь помочь, пожалуйста?

PS - У меня очень большой файл (около 1 ГБ).

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Мне не нравится просто предоставлять комплексные решения, но это казалось самым простым способом объяснить.Эта программа читает файл дважды: сначала для накопления информации о частоте, а затем для вывода измененных данных.

use strict;
use warnings;

@ARGV or die "No input file specified";

open my $fh, '<', $ARGV[0] or die "Unable to open input file: $!";

my %count;

while (<$fh>) {
  next unless my ($key) = split;
  $count{$key}++;
}

seek $fh, 0, 0;
while (<$fh>) {
  chomp;
  next unless my ($key, $rest) = split ' ', $_, 2;
  print "$key $count{$key} $rest\n";
}
0 голосов
/ 27 января 2012

Предполагая, что файл отсортирован, вы можете сделать простые команды:

sorin@sorin: $ join -1 1 -2 2 -o1.1,2.1,1.2 sample.txt <(cut -f1 sample.txt | uniq -c)
46_#1 1 A
47_#1 1 B
49_#1 1 C
51_#1 2 D
51_#1 2 E
  • join - объединить файлы на основе общих полей
    • -1 1 -2 2 объединения на основе первогостолбец из первого файла и второй столбец второго файла
    • -o1.1,2.1,1.2 выбирает, какие столбцы выводить
    • <() подстановка процесса - выходные данные процесса превращаются во входной файл
    • объединение игнорирует начальные пробелы из вывода uniq
  • cut - извлекает только одно поле

Примечание: Если файлы не отсортированы, , вероятно, лучше использовать предыдущий ответ, как я вижу из вашего комментария, что дубликаты находятся далеко

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...