【发布时间】:2013-11-26 15:25:02
【问题描述】:
我有一个多字段文本文件。我想要一个将sort -n -u -k 和uniq -c 的行为结合起来的命令 - 也就是说,对某个键字段的文件进行排序,并提供在原始行之前或延迟的重复项的数量。目前,我要么对某个键进行排序,然后使用sort -n -u -k 获取重复行数中没有重复的第一行,要么通过提取键字段来计算uniq -c 的重复数。
你能建议一个同时实现这两种行为的命令吗?
文件示例(键列可以是任意指定的):
4549 1 22656489 63452157 3235 1116 612 532275 6009800 534075 6012488 477375 5995844 533175 6011144 8388615 236
4549 2 22656489 63452158 3214 1116 613 532275 6009825 534075 6012488 477375 5995831 533175 6011157 8388615 236
4549 3 22656489 63452159 3193 1116 614 532275 6009850 534075 6012488 477375 5995819 533175 6011169 8388615 236
4549 4 22656489 63452160 3173 1116 615 532275 6009875 534075 6012488 477375 5995806 533175 6011182 8388615 235
4549 5 22656489 63452161 3152 1116 616 532275 6009900 534075 6012488 477375 5995794 533175 6011194 8388615 235
4549 6 22656489 63452162 3131 1116 617 532275 6009925 534075 6012488 477375 5995781 533175 6011207 8388615 235
4549 7 22656489 63452163 3111 1116 618 532275 6009950 534075 6012488 477375 5995769 533175 6011219 8388615 235
4549 8 22656489 63452164 3091 1116 619 532275 6009975 534075 6012488 477375 5995756 533175 6011232 8388615 234
4549 9 22656489 63452165 3070 1116 620 532275 6010000 534075 6012488 477375 5995744 533175 6011244 8388615 234
4549 10 22656489 63452166 3050 1116 621 532275 6010025 534075 6012488 477375 5995731 533175 6011257 8388615 234
4549 11 22656489 63452167 3030 1116 622 532275 6010050 534075 6012488 477375 5995719 533175 6011269 8388615 234
【问题讨论】:
-
管道 (
sort -n -k | uniq -c) 是否不符合您的需求? -
不,因为
uniq -c不尊重某个关键字段的唯一性,而是将整行与其他行进行比较。 -
uniq 确实具有有限 忽略不需要的字段的能力(
-f和-s选项)。如果这还不够,您可以(如果它满足您的其他要求)在sort和uniq之间放置cut或awk命令,以将字段重新排序为uniq可以处理的形式。跨度> -
这就是问题所在——我需要
sort和uniq这两种想要的行为——也就是说,保持整行不变,但使用特定字段作为键 and i> 计算该键上的重复次数。 -
我认为如果你能更具体一些会很有帮助:你的输入数据是什么样的,有多少字段,字段分隔符是什么,你想对哪个字段进行排序等等。 ?
标签: linux sorting command-line uniq