2013-08-13 2 views
0

큰 파일 (40 억 개의 행)이 있는데 각 행에는 한 단어가 들어 있습니다. 나는 독특한 단어들과 그에 상응하는 수의 목록을 찾고 싶다.큰 파일에서 고유 한 행을 찾는 방법은 무엇입니까?

sort largefile |uniq -c >outfile

을하지만 여전히 실행되지 않고 출력된다

나는 시도했다.

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

를하지만 횟수를 인쇄하지하지 않습니다

그때 나는 시도했다. awk을 사용하여 카운트도 인쇄하려면 어떻게해야합니까? 또는 대용량 파일을 처리 할 수있는 다른 대체 접근 방식을 사용합니다.

편집 : 파일에 약 1,700 만 개의 고유 단어가 있습니다.

+0

고양이 대형 파일 | awk '{printf ("% s % d \ n", $ 1, arr [$ 1] ++)}'| sort -n – Freddy

+4

"불량 데이터가 있습니다"라고 말하면서 "어리석은 데이터 구조를 잘못 사용하고 있습니다." 40 억 가지가 있다면 속도 최적화를 위해 플랫 파일을 사용하는 것이 잘못된 방법 일 수 있습니다. –

+0

만약'sort'가 여분의 RAM을 많이 사용한다고 말하면 훨씬 더 빠르게 동작 할 것입니다. 예를 들어'sort -S 8G ...'8G 이상의 RAM을 가진 64 비트 시스템에서 실행 중일 때 (정렬은 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은가는 길이지만 40 억 개의 행은 많은 행입니다. 정보가 자주 필요한 경우 데이터베이스를 설정하고 행을 가져옵니다. 이렇게하면 색인 기반 쿼리를 빠르게 처리 할 수 ​​있습니다. 그러나 40 억 개의 행이 많은 행입니다.

+0

이 경우에는 [GDBM] (http://www.gnu.org.ua/software/gdbm/)을 사용할 수도 있습니다 –

2

미리 처리 40 개 백만 라인 파일에 파일을 분할하는 분할 -l 1000000을 사용하여 파일을 정렬 sort -u를 사용합니다. 그들을 하나의 큰 파일로 병합하고, 그것을 다시 sort -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

관련 문제