【问题标题】:Powershell: Count the occurence of every single "1" string in a txt filePowershell:计算txt文件中每个“1”字符串的出现次数
【发布时间】:2021-03-16 01:23:39
【问题描述】:

我们有一个学生和他们的笔记的文本文件,我们必须计算所有学生有多少“1”笔记。 我的代码显示有多少行包含“1”注释,但是当它找到“1”时,它会跳转到下一行。 你能帮帮我吗?

例如:

Huckleberry Finn 2 1 4 1 1
Tom Sawyer 3 2 1 4 1

它应该是 5,但它得到了 2。

$ones = 0

$file= Get-Content notes.txt

foreach ($i in $file) {
    if ($i.Split(' ') -eq 1){
        $ones ++
    }
}

$ones

【问题讨论】:

    标签: string windows powershell foreach count


    【解决方案1】:

    如果您的输入文件中的所有1 标记都以空格分隔,如示例内容所示,请尝试:

    # With your sample file content, $ones will receive the number 5.
    $ones = (-split (Get-Content -Raw notes.txt) -eq '1').Count
    

    上面使用一元形式的-split, the string splitting operatorGet-Content cmdlet 的-Raw 开关,它将文件作为单个多行字符串加载到内存中。

    也就是说,上面的命令将整个文件拆分为空格分隔的标记,并计算所有等于'1' 的标记,所有行。 p>

    如果您打算计算'1' 标记的数量每行,请使用以下方法:

    # With your sample file content, $ones will receive the following *array*:
    #    3, 2
    $ones = Get-Content notes.txt | ForEach-Object { ((-split $_) -eq '1').Count }
    

    至于你尝试了什么

    if ($i.Split(' ') -eq 1)

    虽然$i.Split(' ') 确实返回所有(单个)空格分隔的标记,这些标记包含在存储在$i 中的单个输入行中,但在条件中使用该表达式if 语句的表达式只会导致 one 调用关联的{ ... } 块,因此只会将$ones 增加1 的值,不是手头行中1 令牌的数量。

    【讨论】:

      【解决方案2】:

      解决了!

      谢谢你 mklement0!

      我不明白为什么,但它确实有效:

      $ones = 0
      
      $file= Get-Content notes.txt
      
      foreach ($i in $file) {
          $ones=(-split ($i) -eq '1').Count
          }
      }
      
      $ones
      

      【讨论】:

      • 我现在明白你在做什么:计算1 标记的数量每行。从您的问题中并不清楚这一点,我将其解释为您想计算1s 在整个文件中。您的答案的编写方式意味着 $ones 在循环之后仅包含 last 行的计数,这可能不是本意。我已经更新了我的答案,以展示一种使用单个管道收集 array 中所有每行计数的方法。
      猜你喜欢
      • 2021-11-03
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2019-10-12
      相关资源
      最近更新 更多