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

时间:2018-06-21 08:12:45

标签: powershell batch-file cmd

我在堆栈溢出中使用了不同的来源,例如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

3 个答案:

答案 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