【问题标题】:Count occurences of string (from txt file) in text file and export to CSV or txt file计算文本文件中出现的字符串(来自 txt 文件)并导出到 CSV 或 txt 文件
【发布时间】:2018-06-21 08:12:44
【问题描述】:

我在 Stack Overflow 上使用了不同的来源,例如 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

【问题讨论】:

  • 有关您的代码的帮助:显示您的代码(准确地说是minimal reproducible example)并解释该代码没有按您预期的方式工作的原因。

标签: powershell batch-file cmd


【解决方案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'

【讨论】:

  • 这非常有效。我需要阅读此命令和 powershell。 '[^]+ 是什么意思?在我看来,这个脚本本身会检查文件中的唯一值并计算它们。是这样吗?
  • Group-Object 完成这项工作,并且由于 data.txt 中的每一行都是一个键,因此具有匹配至少一个非空格字符 [^ ]+ 的正则表达式的 Select-String 根本不需要. Get-Content .\data.txt |Group-Object -Noelement 就是你所需要的。
  • Dan:我添加了一些解释。如果它解决了您的问题,请不要忘记“接受”答案。 LotPings:原始样本(此后编辑)由空格分隔。感谢您的“-NoElement”提案!
【解决方案2】:

虽然你没有表现出任何自己的努力,但我还是决定提供一个小脚本:

@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
    )
)

当然您可以根据需要更改输出顺序或格式。

【讨论】:

  • 太棒了。我已经开始使用三行脚本,并且能够输出单个的数字。然后 Julien 提供了一个很好的 powershell 示例,涵盖了所有内容。似乎会更多地了解powershell...
【解决方案3】:

一位朋友刚刚向我展示了使用 AWK 的替代解决方案。不过我更喜欢powershell。谢谢大家。

awk "{s[$0]=s[$0] + 1}END{for (i in s) {print i, s[i]}}"  data.txt > t1

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2021-03-16
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多