我在堆栈溢出上使用了不同的来源,例如,从垃圾邮件中清除我的警报文件(data.txt(,并将唯一出现的事件提取到该文件(unik.txt(。下一步,我卡住了,是使用 unik.txt 并计算数据.txt中的出现次数,并将字符串和计数导出到文本或 csv 文件。 您可能已经猜到了,这是一种创建警报统计信息的方法。我考虑过使用其他方法/语言,但首先想尝试这种方式。
我也读了这篇文章,但没有结束。
从数据中提取.txt:
D_TA204_GT1_DV_AL D_TA204_GT41_DV_AL D_TA204_GT31_DV_AL D_TA204_GT21_DV_AL U_TA364_GT11_LARM U_TA364_GT11_LARM U_TA364_GT11_LARM U_FF415_GT46_L_AL U_TA364_GT11_LARM D_TA204_GT31_DV_AL U_KB6_GT11_DV_AL U_FF415_GT46_L_AL D_TA204_GT21_DV_AL U_KB6_GT11_DV_AL TRE-11-11-I033 TRE-11-11-D5394 U_KB6_GT11_DV_AL U_KB6_GT11_DV_AL U_KB6_GT11_DV_AL
摘自unik.txt:
D_TA204_GT1_DV_AL D_TA204_GT41_DV_AL D_TA204_GT31_DV_AL D_TA204_GT21_DV_AL U_TA364_GT11_LARM U_FF415_GT46_L_AL U_KB6_GT11_DV_AL
如果您的文件仅逐行包含一个警报,则可以使用Get-Content
创建警报列表:
$alarmList = Get-Content -Path .data.txt
如果您的文件包含以空格分隔的警报(如版本之前的示例所示(,则可以使用 CmdLetSelect-String
提取数据文件的所有警报:
$alarmList = (Select-String -Path .data.txt -Pattern '[^ ]+' -AllMatches).Matches.Value
表达式 '[^ ]+' 将捕获一个或多个不带空格的字符的字符串。
然后,使用Group-Object
对列表中的每次警报发生进行计数:
$alarmList | Group-Object -NoElement
您将获得以下统计信息:
Count Name
----- ----
1 D_TA204_GT1_DV_AL
1 D_TA204_GT41_DV_AL
4 U_TA364_GT11_LARM
2 U_FF415_GT46_L_AL
最后,在 CSV 文件中发送统计信息:
(Select-String -Path '.data.txt' -Pattern '[^ ]+' -AllMatches).Matches.Value |
Group-Object -NoElement |
ConvertTo-Csv -Delimiter "`t" -NoTypeInformation |
Out-File -FilePath '.Statistics.csv'
虽然你没有表现出任何自己的努力,但我决定提供一个小脚本:
@echo off
rem // Iterate over lines of `unik.txt`:
for /F usebackq^ delims^=^ eol^= %%I in ("unik.txt") do (
rem // Count number of occurrences in `data.txt`:
for /F %%J in ('^< "data.txt" find /C "%%I"') do (
rem // Return TAB-separated item and count:
echo/%%I %%J
)
)
当然,您可以根据需要更改输出顺序或格式。
一位朋友刚刚向我展示了使用 AWK 的替代解决方案。不过我更喜欢Powershell。谢谢大家。
awk "{s[$0]=s[$0] + 1}END{for (i in s) {print i, s[i]}}" data.txt > t1