计算文本文件中字符串(来自 txt 文件)的出现次数并导出到 CSV 或 txt 文件



我在堆栈溢出上使用了不同的来源,例如,从垃圾邮件中清除我的警报文件(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

最新更新