代码之家  ›  专栏  ›  技术社区  ›  lbedogni

交换文件中的列并删除重复项

  •  1
  • lbedogni  · 技术社区  · 16 年前

    我有这样一个文件:

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

    term1 term2
    

    term2 term1
    

    对我来说是重复的。 这是一个很长的文件,所以我不知道什么可以更快。 有人知道怎么做吗?也许吧?

    7 回复  |  直到 16 年前
        1
  •  1
  •   h0tw1r3    16 年前

    使用perl可以很容易地对行中的每个单词进行排序和排序。

    #!/usr/bin/perl
    
    foreach(sort map { reorder($_) } <>) {
        print;
    }
    
    sub reorder {
        return join(' ', sort { $a cmp $b } split(/\s+/, $_)) . "\n";
    }
    
        2
  •  1
  •   leonbloy    16 年前

    在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,第二个调用一个“sort”命令。。。

        3
  •  1
  •   Arkku    16 年前

    为了保持原始顺序,awk中提供了一种简单(但不一定快速和/或内存高效)的解决方案:

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

    编辑:在ruby中排序可选项:

    ruby -n -e 'puts $_.split.sort.join(" ")' | sort | uniq
    
        4
  •  1
  •   Dennis Williamson    16 年前

    如果你想移除 二者都

    join -v 1 -1 1 <(sort input_file) -v 2 -2 2 <(sort -k 2 input_file) | uniq
    
        5
  •  1
  •   ghostdog74    16 年前
    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
    
        6
  •  1
  •   Debugger    16 年前

    如果文件非常长,也许你应该考虑用C/C++编写程序。我认为这将是最快的解决方案(特别是如果您必须处理每一行的所有文件)。用bash函数处理大文件和重复操作会变得非常慢

        7
  •  1
  •   Daniel Haley    16 年前

    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