gpt4 book ai didi

powershell - 使用 Select-String 检查 powershell 中的两个 .txt 文件

转载 作者:行者123 更新时间:2023-12-03 00:31:45 24 4
gpt4 key购买 nike

我在编写 powershell 脚本方面是全新的。到目前为止,我一直在使用普通批处理,因为这是我公司的要求。在这批中,我使用嵌套的 foor 循环来比较两个 .txt 文件,具体来说,我想执行以下操作:

  • 文件 1 包含很多字符串。每个字符串在一个单独的行中,前面有一个数字和分号,如下所示:658;RMS
  • 文件 2 是一些长文本。

  • 目的是计算文件 2 中文件 1 中每个字符串的出现次数,例如RMS 计数 300 次。

    由于我之前的代码在运行时方面存在一些巨大的缺陷(文件 1 大约有 400 行,文件 2 大约有 500.000 行),我读到 Powershell 中的 Select-String 效率更高。
    但是,当我正在阅读一些教程时,我不清楚如何在这里继续,除了我必须在我的 .bat 中运行 powershellcode。
    我最大的问题是我不确定如何以及在哪里放置我的“变量”,所以两个输入文件 1 和 2

    到目前为止,我正在测试这样的 Select-String 方法:
    powershell -command "& {Select-String -Path *.txt -Pattern "RMS"}"
    我的假设是使用管道,所以是这样的:
    powershell -command "& {<<path to file one, should read line by line>> | Select-String -Path File2.txt -Pattern "value of file 1"}"
    但是,我没有让这个工作。 Powershell 期待某种 psobject在第一个管道之前?

    最佳答案

    为了获得最佳性能,我会像这样处理这个任务。

  • 以 CSV 格式读取包含条款的文件(它是 CSV,带有 ; 分隔符)
  • 将其他文件读入字符串
  • 对于每个术语,计算它在目标字符串中出现的频率(使用 .IndexOf() )

  • 例如
    $data = Import-Csv "file1.txt" -Delimiter ";" -Header ID,Term 
    $target = Get-Content "file2.txt" -Raw
    $counts = @{}

    foreach ($term in $data.Term) {
    $index = -1
    $count = 0
    do {
    $index = $target.IndexOf($term, $index + 1)
    if ($index -gt -1) { $count++ } else { break; }
    } while ($true);
    $counts[$term] = $count
    }

    $counts

    笔记
  • Import-Csv将自动使用输入文件中的第一行作为标题。如果您的文件已经有标题,您可以删除 -Headers范围。
  • Get-Content默认情况下,会将输入文件读入行数组。但是对于这种方法,将整个文件作为一个大字符串是正确的 - 这就是 -Raw做。
  • @{}创建一个空的哈希表
  • $data.Term将访问 CSV
  • 的一列
  • .IndexOf()区分大小写。默认情况下,PowerShell 不区分大小写,但像这样的原生 .NET 方法不会改变它们的行为。这可能是也可能不是您需要的 - 使用 .ToLower()$target$term如果你不关心大小写。
  • 关于powershell - 使用 Select-String 检查 powershell 中的两个 .txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62003411/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com