Linux
列印重複圖案
我有一個馬拉松文件,我想從中列印多次跑步的跑步者的姓名。就像是:
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:]]"
另一個簡單的替代方案(對於不想/不知道的人
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
選項從管道(即名稱)中獲取輸入並在馬拉松文件中搜尋它以給出整行而不是名稱
您必須先使用名稱進行排序。
注意:‘uniq’ 不會檢測重複的行,除非它們是相鄰的。你可能想先對輸入進行排序,或者使用
sort -u' 而不使用
uniq’。您可以使用
-t/-k
選項對這些欄位進行排序:sort -t',' -k 3 marathon
關於以逗號作為分隔符的第三個欄位的排序。
然後你可以用 awk 只列印第 3 列,然後使用
uniq
命令:sort -t',' -k 3 marathon | awk -F, '{print $3}'|uniq -d
/!\ 未測試
如果要保留所有行,可以使用awk保存名稱出現的次數(
count[$3]++
);保留名稱的所有行(lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0;
: 如果是第一行,則儲存行,否則追加)。最後,如果 count number ≥ 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]}}}'