所以,我有一个格式为的数据集:
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列)?数据文件很大.
如果您只想要第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只是为了清理原始列表中的无序序列.
正如我所说,对你来说情况可能并非如此,但有时候在盒子外思考是有利的.