排序数组并删除特定列Perl中的重复项

时间:2017-11-26 19:50:50

标签: perl

我想删除数组col 0中的重复行,使得只保留col 1中的最大值。数据以制表符分隔。共有16列。

def is_visible_for_user(self, user=None):
    if not self.limit_usage or not user:
        return True
    ct = WalletItem.objects.filter(item=self, wallet=user.wallet).count()
    return self.limit_usage > ct

期望的输出:

sample1_EGFR_19 53  exon19 ...
sample1_EGFR_19 12      exon20 ...
sample2_EGFR_19 20      exon19 ...
sample3_EGFR_20 65      exon20 ...
sample2_EGFR_19 25      exon12 ...
sample1_EGFR_20 12      exon20 ...
sample3_EGFR_20 125 exon20 ...

我已经开始使用制表符分隔的文本文件,我将其拆分并填充数组。然后我使用哈希并按键排序。最终输出我正确地对数据进行了排序,但是不会删除重复项。如何删除第一列中现在为空的行?感谢

sample1_EGFR_19 53      exon19 ...
sample1_EGFR_20 12      exon20 ...
sample2_EGFR_19 25      exon12 ...
sample3_EGFR_20 125 exon20 ...

请建议一个直接的方法来完成他的。感谢

以下是代码:

sample1_EGFR_19 53 exon19 ...
                 12 exon20 ...
 sample2_EGFR_19 25 exon12 ...
                 20 exon19 ...
 sample3 EGFR_20 125 exon20 ...
                 65 exon20 ...
 sample1 EGFR_20 12 exon20 ...

1 个答案:

答案 0 :(得分:1)

这是一个相当简单的UNIX单行程序。为什么需要在Perl中编写它?

awk

按第一列升序和第二列降序和数字对其进行排序,然后使用awk从每个组中选择第一行。如果awk 'x != $1 { print; x = $1 }'语句过于混乱,则其功能与tee相同。 (#!/usr/bin/perl use strict; use warnings; sub sort_func { # sort by the first col asc and then by the second col desc and numeric $a->[0] cmp $b->[0] || $b->[1] <=> $a->[1] } my %seen; print map join("\t", @$_), # re-join the fields with tabs into the original line grep !$seen{$_->[0]}++, # select the first line of each sorted group sort sort_func # sort lines using the above sort function map [split /\t/, $_, 3], # split by tabs so we can sort by the first two fields <>; # read lines from stdin or the filename given by ARGV[0] 将行写入文件显示输出到终端。)

如果你真的必须使用Perl,这里是描述问题的简单解决方案:

./sortlines.pl /data/Test/output.txt >/data/Test/output_changed.txt

标记文件可执行文件并按如下方式使用:

UISearchController