尋找更多重複項

尋找更多重複項

我有一個巨大的清單,例如

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解析為三個欄位:xfoo bary

記錄規則(程式碼片段的中間部分)應用於輸入中的每個記錄(行)。因為 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

相關內容