
我有一個巨大的清單,例如
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
我想搜尋更多 2 之後的重複號碼; 3號之前;
對於第一行,數字是5450-7938-7992-5530
,另一行4532-4142-5613-9690
等等
答案1
考慮以下 awk 腳本duplicates.awk
:
#!/usr/bin/awk -f
BEGIN {
RS = "(\r\n|\n\r|\r|\n)"
FS = "[\t\v\f ]*;[\t\v\f ]*"
split("", count)
}
{
count[$3]++
}
END {
for (item in count) {
if (count[item] > 1)
printf "%s\n", item
}
}
請記住使用例如使其可執行chmod a+rx duplicates.awk
。您可以透過管道將輸入傳遞給命令,也可以提供一個或多個輸入檔案作為命令列參數(多個檔案被視為串聯成一個檔案)。
BEGIN 規則設定通用換行符(即,它接受從 MS-DOS 到舊 Mac 到 Unix 的所有換行符約定),並使用分號;
作為欄位分隔符號。為了方便說明,我讓欄位分隔符號也消耗它周圍的所有空格,以便x;foo bar ; y
解析為三個欄位:x
、foo bar
和y
。
記錄規則(程式碼片段的中間部分)應用於輸入中的每個記錄(行)。因為 awk 支援關聯數組,所以我們只需使用第三個字段(字串)作為count
數組的鍵,並將該條目加一。 (在 awk 中增加一個不存在的陣列條目會產生 1,因此第一個增量會產生 1,並且程式碼將按照您的預期工作。)
END 規則掃描count
數組,列印至少出現兩次的條目。請注意,此輸出是隨機順序的。 (有一些方法可以根據出現的次數對輸出進行排序,甚至可以保留文件中(第一次出現的)原始順序,但是OP沒有提到任何關於排序的要求,所以我沒有打擾;未定義order 是最容易實現的。
如果要列印例如字串(第三列中的值)出現的次數,請改用以下 END 規則:
END {
for (item in count)
printf "%15d %s\n", count[item], item
}
輸出經過格式化,以便為數字保留輸出中的前 15 個字符,並且值從第 17 個字符開始。
答案2
在 stack.txt 檔案中建立一些重複值,然後列印輸出 -
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
使用以下命令 -
awk 'BEGIN{FS=";"}{a[$3]++} END {for(k in a) print a[k],k}' stack.txt
輸出 -
3 4532-4142-5613-9690
2 5292-4905-4356-2840
3 5450-7938-7992-5530
2 4556-9998-5999-3300