具有`sort -n -u -k`和`uniq -c`的组合行为的命令

时间:2013-11-26 15:25:03

标签: linux sorting command-line uniq

我有一个多字段文本文件。我希望有一个命令可以同时结合sort -n -u -kuniq -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

2 个答案:

答案 0 :(得分:1)

正如我目前所理解的那样,您希望指定一个或多个列作为键使用,并获得每个输出行显示该键的多重性的结果。在这种情况下,假设您的数据位于名为“data”的文件中,我们希望将第17列作为密钥:

$ awk '{print $17}' data  | sort -n | uniq -c
  4 234
  4 235
  3 236

因此,236的值在第17列中显示在测试数据中总共3次。或者,假设您希望将列6,8,1和3作为键(并按此顺序):

$ awk '{print $6,$8,$1,$3}' data  | sort -n | uniq -c
 11 1116 532275 4549 22656489

对于此密钥,所有11行都是重复的。

这种方法有三个步骤。首先,我们awk按您想要的顺序选择所需的列。其次,sort -n在键上对它们进行数字排序。最后,uniq计算重复项。

更新:假设,如上所述,我们希望使用第6,8,1和3列作为键,但根据您的注释,我们希望保留原始行之一。在这种情况下,我们指示awk将原始的17列放在键之前,我们告诉sort对键进行排序(第18列),然后我们指示uniq忽略前17列:

awk '{print $0,$6,$8,$1,$3}' data  | sort -k18 -n | uniq -f 17 -c

对于您的样本数据,结果如下:

     11        4549             10       22656489       63452166           3050           1116            621         532275        6010025         534075        6012488         477375        5995731         533175        6011257        8388615            234 1116 532275 4549 22656489

如果您只想打印原始的17列,那么我们可以使用perl显示前17列并裁剪关键:

awk '{print $0,$6,$8,$1,$3}' data  | sort -k18 -n | uniq -f 17 -c | perl -nle '@a=split;print join " ", @a[0..17]'

导致:

11 4549 10 22656489 63452166 3050 1116 621 532275 6010025 534075 6012488 477375 5995731 533175 6011257 8388615 234

答案 1 :(得分:1)

使用decorate-sort-undecorate,您可以将数据附加到您希望处理的字段,执行处理并删除多余的字段。例如,对字段17和5进行排序:

awk '{print $0 OFS $17 OFS $5}' test_s  | sort -n -k18 -k19  | uniq -c -f17 | awk '{NF=18;print}'

您首先附加关键字段,然后在其上添加sortuniq,然后仅保留uniq和原始字段添加的计数。