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

hi1*_*i15 2 unix sorting

所以,我有一个格式为的数据集:

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
Run Code Online (Sandbox Code Playgroud)

器官名称(此处为Heart)可能不同.我有几个关于数据的器官.我想知道如何弄清楚该列的独特元素的名称(第5列)?数据文件很大.

pax*_*blo 6

如果您只想要第5列中的唯一值,则可以执行以下操作:

awk '{print $5}' inputFile | sort | uniq
Run Code Online (Sandbox Code Playgroud)

要么:

awk '{print $5}' inputFile | sort -u
Run Code Online (Sandbox Code Playgroud)

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

awk '{arr[$5] = 1} END {for (key in arr) {print key}}' inputFile
Run Code Online (Sandbox Code Playgroud)

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

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

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


另外,如果您对输入数据有额外的了解,有时可以提高效率.这可能是你的情况,也可能不是这种情况,但我曾经遇到过这样的情况,即数据已经大部分排在(在你的情况下)第5列(想想只是在一个其他排序的器官文件末尾添加条目) ).

这意味着我会得到很长的序列heart或其他器官,但偶尔,你可能会得到如下组合:

heart
heart
heart
heart
heart
heart
liver
liver
lung
heart    <= What the ?
Run Code Online (Sandbox Code Playgroud)

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

awk '{print $5}' | uniq | sort | uniq
Run Code Online (Sandbox Code Playgroud)

现在,这可能看起来很奇怪,但输入数据有很长的相同器官这一事实意味着第一个uniq(在O(n)处)大大减少了sort(最好是O(n log n))的工作量.

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

heart    <= uniquified one
liver
lung
heart
Run Code Online (Sandbox Code Playgroud)

而不是十.

然后决赛uniq只是为了清理原始列表中的无序序列.

正如我所说,对你来说情况可能并非如此,但有时候在盒子外思考是有利的.