比较一行文本中的两个值,然后根据结果执行条件任务

问题描述 投票:0回答:1

我是 Powershell 新手,只编写了几个基本脚本。 这是我正在尝试做的事情: 对于下面的文本行,我想比较每行末尾的两个值(参见下面的 pstest.txt)(50,20 line3 ; 20,50 line4) 如果第一个值高于第二个值,则替换该行上的文本。 我已经研究了几种可能的方法,但找不到适合这种情况的方法。

到目前为止,我已经找到了替换特定文本的解决方案,并找到了一种从特定行检索值进行比较的方法,但不确定如何从这里继续。 我的目标是仅修改第一个“维度”大于第二个“维度”的行。 当条件为真时,在“5-STD”后面添加“T”,并修剪行尾。 然后将文件写入原始文件。 下面是我的脚本,到目前为止,我包含了 pstest.txt 文件的副本以供参考。

$content = Get-Content "c:emp\pstest.txt"

$line3 = Get-Content "c: emp\pstest.txt" | Select-Object -Index 2 # 获取第一个行项目(忽略前 2 行) $line4 = Get-Content "c: emp\pstest.txt" | $line4 = Get-Content "c: emp\pstest.txt" | Select-Object -Index 3 # 获取第二行项目 $value1 = $line3.Substring(129,2) # 从第一个行项目获取第一个维度值 $value2 = $line3.Substring(133,2) # 从第一个行项目获取第二个维度值 $value3 = $line4.Substring(129,2) # 从第二行项目获取第一维度值 $value4 = $line4.Substring(133,2) # 从第二行项目获取第二维度值 Write-Host $value1, $value2 # 显示值 - 仅测试 Write-Host $value3, $value4 # 显示值 - 仅测试

$内容| ForEach-Object {$_ -replace '"5-STD", ', '"5-STD",T'} |设置内容“C:emp est.txt”

Pstest.txt

,“WinIG 导入文件” *, "0918230406", "", "0918230406", "091823", "", "" 1, 1, 0, "CLAC-DSB-A", 50, 50, 0.875, "", "", "", "", 0.0, 0.0, "", "", "", "25504-6- 1-IGU-TRAP 108279-1", "5-STD", , , 0.0, 20, 50, 20 2, 1, 0, "CLAC-DSB-A", 50, 50, 0.875, "", "", "", "", 0.0, 0.0, "", "", "", "25504-6- 2-IGU-TRAP 108279-2"、"5-STD"、、、、0.0、20、20、50

powershell compare
1个回答
0
投票

使用

switch
语句及其
-File
-Regex
参数进行基于 regex 的逐行处理:

& {
  switch -Regex -File in.txt {
    '^(.+), (\d+), (\d+)$' {
      if ([int] $Matches.2 -gt [int] $Matches.3) {
        $Matches.1 + ',T'
      } else {
        $_ # pass through
      }
    }
    default { $_ } # pass through
  }
} |
  Set-Content out.txt

注:

  • 上面假设所有以两个逗号分隔的十进制数字结尾的行都是感兴趣的。

  • Regex

    ^(.+), (\d+), (\d+)$
    匹配这些行,并通过捕获组(
    (...)
    )捕获感兴趣的子字符串,结果反映在自动
    $Matches
    变量
    中,其中
    $Matches.1
    包含第一个捕获组的内容匹配,
    $Matches.2
    第二个,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.