2013-08-13 4 views
0

У меня есть большой файл (4 миллиарда строк), каждая строка содержит одно слово. Я хочу найти список уникальных слов и соответствующие значения.Как найти уникальные строки в большом файле?

Я пробовал:

sort largefile |uniq -c >outfile

но это все еще работает и не выход.

тогда я попробовал:

awk '!arr[$1]++' largefile >outfile

, но это не не печатают счетчики. Как я могу использовать awk для печати счетчиков? или любой другой альтернативный подход, который может обрабатывать большие файлы.

Редактировать: В файле содержится около 17 миллионов уникальных слов.

+0

кот крупный файл | awk '{printf ("% s% d \ n", $ 1, arr [$ 1] ++)}' | sort -n – Freddy

+4

Это называется «наличие плохих данных» или, возможно, «неправильное использование смешной структуры данных». Если у вас есть 4 миллиарда штук, плоские файлы, вероятно, являются неправильным способом, если вы пытаетесь оптимизировать скорость. –

+0

Если вы скажете 'sort' использовать столько оперативной памяти, сколько сможете, это будет работать много, быстрее. Например, 'sort -S 8G ...', если вы работаете в 64-разрядной системе с более чем 8G оперативной памяти (и ваш сорт - это 64-разрядный исполняемый файл) –

ответ

1

Насколько велики файлы? сколько уникальных слов вы ожидаете? В большинстве случаев ваше решение sort | uniq - хорошее начало, но, очевидно, если файлы слишком большие, это не хорошо. Скрипт Perl, который сохраняет каждое слово в хеше, может сработать для вас.

Это непроверенное и из памяти, так что она может иметь кучу ошибок ...

my %words =(); 
open(IN, "<", "yourfile") or die "Arrgghh file didn't open: $!"; 
while(<IN>) { 
    chomp; 
    $words{$_}++; 
} 
close(IN); 
for my $k in (keys %words) { 
    print "$k $words{$k}\n"; 
} 
3

Ваш первый пример в порядке. Попробуйте просто:

sort largefile | uniq -c 

потребуется какое-то время.

+0

не требует от команды uniq ввода сортироваться? – mghandi

+0

@mghandi, вы правы, я отредактировал свой ответ. – elyase

3

uniq - это путь, но 4 миллиарда строк - это просто много строк. Если вам нужна информация часто, я бы установил базу данных и импортировал строки. Это ускорит запросы, основанные на индексах. Но, однако, 4 миллиарда строк - это много строк

+0

Вы также можете использовать [GDBM] (http://www.gnu.org.ua/software/gdbm/) в этом случае –

2

Preprocess файлы с помощью разделения -l, чтобы 1000000 разделить этот файл на 40 1000000 строк файлов, сортировать их используя sort -u. объедините их обратно в один большой файл, дайте этому, чтобы отсортировать -u снова.

## if you use just this, you need gawk 4.1 
# 
gawk '{key[$0]++;} END { for(word in key) { print key[word] "\t" word }}' bigfile 


cd to directory with bigfile 
split -l 1000000 bigfile aa, small ## makes smallaa, smallab, etc. 

for files in small* 
do 
    echo "Sorting file $files" 
    sort -u $files -o $files.srt 
done 

sort -m *.srt -o bigagain 
sort -u bigagain > smallish 

now have words but no counts. 
gawk '{key[$0]++;}' smallish bigfile # or better yet 
+0

dīvide et īmpera – asdmin

Смежные вопросы