查找更多重复项

查找更多重复项

我有一个巨大的清单,例如

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

相关内容