【发布时间】:2017-11-07 05:34:25
【问题描述】:
应该像运行 uniq 命令一样,但是按列。例如:
A B C B
A C B C
啊啊啊啊
第二列和第四列是相同的。获得以下结果的最佳方法是什么?
A B C
A C B
啊啊啊
但是,一开始不知道哪些列是相同的,这与用于行的 uniq 命令非常相似。
【问题讨论】:
-
如果列是唯一的,那么最后一列不应该是“A”而不是“A A A”吗?
应该像运行 uniq 命令一样,但是按列。例如:
A B C B
A C B C
啊啊啊啊
第二列和第四列是相同的。获得以下结果的最佳方法是什么?
A B C
A C B
啊啊啊
但是,一开始不知道哪些列是相同的,这与用于行的 uniq 命令非常相似。
【问题讨论】:
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' ] );
}{(称为“爱斯基摩人问候语”)将每一行的代码运行与整个输入处理完毕后运行的代码分开。它遍历@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
);
最后一次打印移动每列的第一个元素,即将结果转回。
【讨论】: