首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从终端/Unix中查找数据列中的唯一元素

从终端/Unix中查找数据列中的唯一元素
EN

Stack Overflow用户
提问于 2014-07-24 01:14:43
回答 2查看 12K关注 0票数 4

因此,我有一个格式的数据集:

代码语言:javascript
复制
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栏)独特元素的名称?数据文件很大。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-24 01:22:35

如果只想要第5列中的唯一值,可以这样做:

代码语言:javascript
复制
awk '{print $5}' inputFile | sort | uniq

或者:

代码语言:javascript
复制
awk '{print $5}' inputFile | sort -u

或者,如果您出于某种原因不想使用sort,可以单独使用awk

代码语言:javascript
复制
awk '{arr[$5] = 1} END {for (key in arr) {print key}}' inputFile

为每一行执行的arr[$5] = 1命令只需使用列5作为键更新关联数组。如果条目不存在,则创建该条目。如果它确实存在,它只是简单地被覆盖。

然后,完成文件后,输出该关联数组的所有键。由于创建或覆盖性质,这将是与重复删除键。

对于一个巨大的文件,从O(n log n)排序切换到O(n)进程可能会加快速度。但是,所有的优化努力,衡量,不要猜测!

顺便说一句,如果你对输入数据有额外的了解,你有时可以使事情变得更有效率。这对您来说可能是也可能不是这样,但我曾经遇到过这样的情况:数据已经大部分是在第5列(在您的例子中)上排序的(假设只是在一个其他排序的器官文件的末尾添加条目)。

这意味着我会得到长序列的heart或其他器官,但偶尔,您可能会得到这样的混合:

代码语言:javascript
复制
heart
heart
heart
heart
heart
heart
liver
liver
lung
heart    <= What the ?

有了这样的额外信息,你可以加快速度:

代码语言:javascript
复制
awk '{print $5}' | uniq | sort | uniq

现在,这在您看来可能很奇怪,但是传入的数据有很长一段相同的器官,这意味着第一个uniq (在O(n )处)大大减少了sort的工作量(最多是O(N log ))。

在上面显示的数据中,sort只需要处理四项:

代码语言:javascript
复制
heart    <= uniquified one
liver
lung
heart

而不是十个。

最后一个uniq就是清理原始列表中的无序部分。

就像我说过的,对你来说可能不是这样,但有时候像这样跳出框框思考是有好处的。

票数 11
EN

Stack Overflow用户

发布于 2014-07-24 01:26:53

awk '{print $5}' <file> | sort -u

awk {print $5}

将打印数据的第五列。

排序-u

按字母顺序对数据进行排序,然后只输出唯一的元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24923615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档