我在堆栈溢出中使用了不同的来源,例如this,以清除垃圾邮件中的警报文件(data.txt)并将唯一的事件提取到该文件(unik.txt)中。困扰我的下一步是使用unik.txt并计算data.txt中出现的次数,并将字符串导出并计数为文本或csv文件。 您可能已经猜到它是创建警报统计信息的一种方法。我已经考虑过使用其他方法/语言,但首先要尝试这种方式。
我还读了this帖子,但也没有结束。
从data.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
答案 0 :(得分:1)
如果文件仅按行包含一个警报,则可以使用Get-Content
创建一个警报列表:
$alarmList = Get-Content -Path .\data.txt
如果您的文件包含以空格分隔的警报(例如在版本之前的示例中),则可以使用Select-String
CmdLet提取数据文件的所有警报:
$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'
答案 1 :(得分:1)
尽管您没有付出任何努力,但我还是决定提供一个小脚本:
@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
)
)
当然,您可以根据需要更改输出顺序或格式。
答案 2 :(得分:0)
一个朋友刚刚向我展示了一种使用AWK的替代解决方案。我更喜欢powershell。谢谢大家。
awk "{s[$0]=s[$0] + 1}END{for (i in s) {print i, s[i]}}" data.txt > t1