打印重复图案

打印重复图案

我有一个马拉松文件,我想从中打印多次跑步的跑步者的姓名。就像是:

M, 2:08:58.0, John Lukas, USA, 1997-07-25, Paris, France

F, 2:15:04:0, Abebbe Boukari, KEN, 2000-10-01, London, UK 

等等

我尝试过 uniq 但它没有发生:

uniq -d marathon | grep "[[:alpha:]]\+[ ]\+[[:alpha:]]"

答案1

您必须首先使用名称进行排序。

注意:“uniq”不会检测重复的行,除非它们相邻。您可能想首先对输入进行排序,或者使用不带“uniq”的“sort -u”。

您可以使用-t/-k选项对这些字段进行排序:

sort -t',' -k 3 marathon

对第三个字段进行排序,以逗号作为分隔符。

然后你可以用awk只打印第三列,然后使用命令uniq

sort -t',' -k 3 marathon | awk -F, '{print $3}'|uniq -d

/!\ 未测试

如果要保留所有行,可以使用 awk 保存名称出现的次数 ( count[$3]++);保留名称的所有行(lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0;:如果是第一行,则存储行,否则追加)。最后,如果计数 ≥ 2,则打印名称 ( if(count[i]>1){ print lines[i]}) 的行:

sort -t',' -k 3 marathon | awk -F, '{count[$3]++;lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0;}END{for (i in count){if(count[i]>1){ print lines[i]}}}'

答案2

另一个简单的替代(对于那些不想/不知道的人awk)脚本将是:

#!/bin/bash
sort -t',' -k 3 marathon | cut -d',' -f 3 | uniq -d

如果有人想打印整行而不是只是名称:

#!/bin/bash
sort -t',' -k 3 marathon | cut -d',' -f 3 | uniq -d | grep -f - marathon

在以上脚本中:

  • sort采用第三个字段进行排序,用作选项,的分隔符和选项-t的第三个字段-k
  • cut,命令只是使用分隔符剪切第三个字段
  • -d仅打印重复行的选项uniq,这正是问题作者想要的 - “打印重复模式”
  • -f选项从管道获取输入(即名称)并在马拉松文件中搜索它以给出整行而不仅仅是名称

相关内容