Linux

列印重複圖案

  • December 8, 2014

我有一個馬拉松文件,我想從中列印多次跑步的跑步者的姓名。就像是:

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]}}}'

引用自:https://unix.stackexchange.com/questions/172064