它应该像运行uniq命令一样,而是按列运行。例如:
A B C B
A C B C
A A A A
第二和第四列是相同的。获得以下结果的最佳方法是什么?
A B C
A C B
A A
但是,首先不知道哪些列是相同的,就像对行的uniq命令一样。
答案 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|A
,B|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
);
最后一次打印移动每列的第一个元素,即它将结果转回。