我有一个马拉松文件,我想从中打印多次跑步的跑步者的姓名。就像是:
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
选项从管道获取输入(即名称)并在马拉松文件中搜索它以给出整行而不仅仅是名称