删除linux中重复列的最佳方法

时间:2017-06-06 09:15:32

标签: bash shell command uniq

它应该像运行uniq命令一样,而是按列运行。例如:

A B C B
A C B C
A A A A

第二和第四列是相同的。获得以下结果的最佳方法是什么?

A B C
A C B
A A

但是,首先不知道哪些列是相同的,就像对行的uniq命令一样。

1 个答案:

答案 0 :(得分:0)

Perl救援!

perl -lane '
    push @{ $c[$_] }, $F[$_] for 0 .. $#F;
    }{
    for (@c) {
        $s = join "|", @$_;
        $seen{$s}++ or push @r, $_;
    }
    print join " ", map shift @$_, @r while @{ $r[0] }
    ' -- inputfile

第一行转动输入,即它创建以下结构:

@c = ( [ 'A', 'A', 'A' ],
       [ 'B', 'C', 'A' ],
       [ 'C', 'B', 'A' ],
       [ 'B', 'C', 'A' ] );

}{(称为“Eskimo greeting”)在处理完整个输入后将每行的代码运行与代码运行分开。它遍历@c数组并仅保留唯一列(通过创建每个列的字符串,如A|A|AB|C|A等,并将它们存储在%seen哈希中。

结构将是

@r = ( [ 'A', 'A', 'A' ],
       [ 'B', 'C', 'A' ],
       [ 'C', 'B', 'A' ] );

并且哈希看起来像

%seen = ( 'B|C|A' => 2,
          'A|A|A' => 1,
          'C|B|A' => 1
);

最后一次打印移动每列的第一个元素,即它将结果转回。