2010-04-12 96 views
1

我有一個這樣的文件:換入文件列並刪除重複

term1 term2 
term3 term4 
term2 term1 
term5 term3 
..... ..... 

什麼,我需要做的就是在他們出現的任何順序刪除重複,如:

term1 term2 

term2 term1 

對我來說是重複的。 這是一個非常長的文件,所以我不知道什麼可以更快。 有沒有人有關於如何做到這一點的想法? awk也許?

回答

1

訂購在線路的每個單詞和排序是容易用Perl。

./scriptbelow.pl < datafile.txt | uniq的

#!/usr/bin/perl 

foreach(sort map { reorder($_) } <>) { 
    print; 
} 

sub reorder { 
    return join(' ', sort { $a cmp $b } split(/\s+/, $_)) . "\n"; 
} 
1

在Perl中:

while($t=<>) { 
@ts=sort split(/\s+/, $t); 
$t1 = join(" ", @ts); 
print $t unless exists $done{$t1}; 
$done{$t1}++; 
} 

或者:

cat yourfile | perl -n -e 'print join(" ", sort split) . "\n";' | sort | uniq 

我不知道哪一個執行對大文件更好。第一個產生在內存中一個巨大的Perl HashMap中,第二個調用「排序」命令

1

要保留原來的排序,在AWK一個簡單的(但不一定是快速和/或存儲效率)的解決方案:

awk '!seen[$1 " " $2] && !seen[$2 " " $1] { seen[$1 " " $2] = 1; print } 

編輯:在紅寶石排序選擇:

ruby -n -e 'puts $_.split.sort.join(" ")' | sort | uniq 
1

如果該文件是非常非常長,也許你應該考慮用C/C++編寫程序。我認爲這將是最快的解決方案(特別是如果您必須處理您閱讀的每行文件的所有文件)。如果要刪除使用bash功能治療獲得大文件和重複操作

1

很慢「字詞1字詞2」和「詞條2字詞1」:

join -v 1 -1 1 <(sort input_file) -v 2 -2 2 <(sort -k 2 input_file) | uniq 
1
awk '($2FS$1 in _){ 
delete _[$1FS$2];delete _[$2FS$1] 
next 
} { _[$1FS$2] } 
END{ for(i in _) print i } ' file 

輸出

$ cat file 
term1 term2 
term3 term4 
term2 term1 
term5 term3 
term3 term5 
term6 term7 

$ ./shell.sh 
term6 term7 
term3 term4 
1

我會這樣做的方式(如果你不需要保留雙列)是:

sed 's/ /\n/g' test.txt | sort -u 

這裏的輸出是什麼樣子(無視我的質樸提示):

[~] 
==> cat test.txt 
term1 term2 
term3 term4 
term2 term1 
term5 term3 
[~] 
==> sed 's/ /\n/g' test.txt | sort -u 
term1 
term2 
term3 
term4 
term5