我有一個這樣的文件:換入文件列並刪除重複
term1 term2
term3 term4
term2 term1
term5 term3
..... .....
什麼,我需要做的就是在他們出現的任何順序刪除重複,如:
term1 term2
和
term2 term1
對我來說是重複的。 這是一個非常長的文件,所以我不知道什麼可以更快。 有沒有人有關於如何做到這一點的想法? awk也許?
我有一個這樣的文件:換入文件列並刪除重複
term1 term2
term3 term4
term2 term1
term5 term3
..... .....
什麼,我需要做的就是在他們出現的任何順序刪除重複,如:
term1 term2
和
term2 term1
對我來說是重複的。 這是一個非常長的文件,所以我不知道什麼可以更快。 有沒有人有關於如何做到這一點的想法? awk也許?
訂購在線路的每個單詞和排序是容易用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";
}
在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中,第二個調用「排序」命令
要保留原來的排序,在AWK一個簡單的(但不一定是快速和/或存儲效率)的解決方案:
awk '!seen[$1 " " $2] && !seen[$2 " " $1] { seen[$1 " " $2] = 1; print }
編輯:在紅寶石排序選擇:
ruby -n -e 'puts $_.split.sort.join(" ")' | sort | uniq
如果該文件是非常非常長,也許你應該考慮用C/C++編寫程序。我認爲這將是最快的解決方案(特別是如果您必須處理您閱讀的每行文件的所有文件)。如果要刪除使用bash功能治療獲得大文件和重複操作
很慢都「字詞1字詞2」和「詞條2字詞1」:
join -v 1 -1 1 <(sort input_file) -v 2 -2 2 <(sort -k 2 input_file) | uniq
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
我會這樣做的方式(如果你不需要保留雙列)是:
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