计算两列文件中的唯一行,忽略顺序

时间:2014-04-01 21:34:08

标签: python sql perl bash

我有一个由两列数字组成的文件,这些数字相当长(约2亿行)。

示例:

    0 1
    1 0
    2 3
    4 5
    4 5 
    5 4

我想要的输出是一个文件,它计算每行的次数,将处理的行视为不同。

示例输出:

    0 1 2
    2 3 1
    4 5 3

bash,perl,python中的任何脚本都没问题。我对计数列的出现位置(第一个或最后一个)以及最终输出中两个列条目的顺序也无动于衷。

因为我在每个人身上都是新人,所以我认为在与sortuniq一起攻击某些内容之前,我会问专业人士。除非那是最好的方法,否则我对这种大小的文件进行排序犹豫不决。

4 个答案:

答案 0 :(得分:2)

2亿行“可能”仍然足够小,可用于单行。注意,将结果输出到STDOUT。

perl -lane '$c{join " ", sort {$a <=> $b} @F}++; END { print "$_ $c{$_}" for keys %c}' file

对于可扩展的内容,您确实需要展示自己的作品。

答案 1 :(得分:0)

data = """0 1
    1 0
    2 3
    4 5
    4 5 
    5 4
"""
lines = data.splitlines()
data_list_of_sets = map(lambda x:" ".join(sorted(x.split())),lines)
from collections import Counter
print Counter(data_list_of_sets)

答案 2 :(得分:0)

# cat nums
    0 1
    1 0
    2 3
    4 5
    4 5
    5 4

# perl -lnE 'my ($ignore, @nums) = split(/\s+/, $_);
             my $norm_str = join " ", sort {$a <=> $b} @nums;
             $results->{$norm_str}++;
             }{ 
             for my $val (keys %$results) { 
               say $val, " ", $results->{$val};
             }' nums
4 5 3
0 1 2
2 3 1

答案 3 :(得分:0)

使用perl的东西(如果已经安装了Data :: Printer模块)。

perl -MDDP -lanE '$h{join " ",sort{$a<=>$b}@F}++}{p %h'

产生

{
    '0 1'   2,
    '2 3'   1,
    '4 5'   3
}