因此,我有一个格式的数据集:
BBS1 Bbs1 reg 7 Heart
ASAP2 Asap2 reg 5 Heart
SPATA22 Spata22 reg 1 Heart
MYLK4 Mylk4 reg 1 Heart
ATP8A1 Atp8a1 reg 5 Heart现在器官的名字(这里的心脏)可以不同。我有几个器官是关于数据的。我想知道如何才能找出该列(第5栏)独特元素的名称?数据文件很大。
发布于 2014-07-24 01:22:35
如果只想要第5列中的唯一值,可以这样做:
awk '{print $5}' inputFile | sort | uniq或者:
awk '{print $5}' inputFile | sort -u或者,如果您出于某种原因不想使用sort,可以单独使用awk:
awk '{arr[$5] = 1} END {for (key in arr) {print key}}' inputFile为每一行执行的arr[$5] = 1命令只需使用列5作为键更新关联数组。如果条目不存在,则创建该条目。如果它确实存在,它只是简单地被覆盖。
然后,完成文件后,输出该关联数组的所有键。由于创建或覆盖性质,这将是与重复删除键。
对于一个巨大的文件,从O(n log n)排序切换到O(n)进程可能会加快速度。但是,所有的优化努力,衡量,不要猜测!
顺便说一句,如果你对输入数据有额外的了解,你有时可以使事情变得更有效率。这对您来说可能是也可能不是这样,但我曾经遇到过这样的情况:数据已经大部分是在第5列(在您的例子中)上排序的(假设只是在一个其他排序的器官文件的末尾添加条目)。
这意味着我会得到长序列的heart或其他器官,但偶尔,您可能会得到这样的混合:
heart
heart
heart
heart
heart
heart
liver
liver
lung
heart <= What the ?有了这样的额外信息,你可以加快速度:
awk '{print $5}' | uniq | sort | uniq现在,这在您看来可能很奇怪,但是传入的数据有很长一段相同的器官,这意味着第一个uniq (在O(n )处)大大减少了sort的工作量(最多是O(N log ))。
在上面显示的数据中,sort只需要处理四项:
heart <= uniquified one
liver
lung
heart而不是十个。
最后一个uniq就是清理原始列表中的无序部分。
就像我说过的,对你来说可能不是这样,但有时候像这样跳出框框思考是有好处的。
发布于 2014-07-24 01:26:53
awk '{print $5}' <file> | sort -u
awk {
print $5}
将打印数据的第五列。
排序-u
按字母顺序对数据进行排序,然后只输出唯一的元素。
https://stackoverflow.com/questions/24923615
复制相似问题