我有一个巨大的清单,例如
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