从文件中的字符串中提取特定标记并导出到其他文件

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

我的数据文件a.alm看起来像这样:

2018-05-19  00:26:00,551 [LUNSC1  ] D_TA204_GT1_DV_AL             CFN              LARM      D_TA204_GT1_Reglerfel                  
2018-05-19  00:28:01,049 [LUNSC1  ] D_TA204_GT41_DV_AL            CFN              LARM      D_TA204_GT41_Reglerfel                 
2018-05-19  00:28:01,049 [LUNSC1  ] D_TA204_GT31_DV_AL            CFN              LARM      D_TA204_GT31_Reglerfel                 
2018-05-19  00:28:01,049 [LUNSC1  ] D_TA204_GT21_DV_AL            CFN              LARM      D_TA204_GT21_Reglerfel                 
2018-05-19  00:35:19,627 [LUNSC1  ] U_TA364_GT11_LARM             CFN              LARM      U_TA364_GT11_LARM                      
2018-05-19  00:39:56,135 [LUNSC1  ] U_TA364_GT11_LARM             CFN              LARM      U_TA364_GT11_LARM                      
2018-05-19  00:47:12,612 [LUNSC1  ] U_KB6_GT11_DV_AL              CFN              LARM      U-KB6-GT11 Avvikelselarm   

我想将令牌5和8​​提取到另一个文件。在我的代码中,我使用split函数读取文件和循环的内容。

$alarmList = @(Get-Content -Path '.\A.ALM') | foreach {
    $test = $_ -split ' '
    Write-Host $test[6]" "$test[9]
} | Out-File -FilePath '.\Output.txt'

输出只给我第一个标记。我无法理解如何正确地将其打印到文件中。尝试用Write-Host取代File-Output没有任何好结果。

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_KB6_GT11_DV_AL 
U_FF415_GT46_L_AL 
U_KB6_GT11_DV_AL 
U_KB6_GT11_DV_AL 
U_KB6_GT11_DV_AL 

我之前使用此脚本在命令行中管理了这个。

FOR /F "tokens=5" %%i in (A.alm) do echo %%i >> data.txt

但我想在PowerShell中进行管道处理,以便能够使用我已经拥有的脚本中的数据计算出现的数据。

(Select-String -Path '.\data.txt' -Pattern '[^ ]+' -AllMatches).Matches.Value |
    Group-Object -NoElement |
    ConvertTo-Csv -Delimiter "`t" -NoTypeInformation |
    Out-File -FilePath '.\Statistics.csv'

这很好用,我理解其中的大部分内容。

    $alarmList = @(Get-Content -Path '.\A.ALM') | foreach { 
    $token = $_ -split ' +'
    [PSCustomObject]@{
         date = $token[0]
         time = $token[1]
         H2   = $token[2]
         H3   = $token[3]
         H4   = $token[4]
         H5   = $token[5]
         H6   = $token[6]
         H7   = $token[7]
         H8   = $token[8]
    }
}
$alarmList | Group H4 -NoElement | Select Name,Count | Out-Gridview
string powershell
2个回答
3
投票

for /fccounts连续分隔符(默认为空格)只有一个

  • 复制此行为使用-split ' +'

只是为了演示-split运算符的正则表达式结果:

(Get-Content -Path '.\A.ALM') | foreach { 
    $token = $_ -split ' +'
    for ($i=0;$i -le 8;$i++){
        "token[{0}]={1}" -f $i,$token[$i]
    }
}

上面a.alm的输出短路:

token[0]=2018-05-19
token[1]=00:47:12,612
token[2]=[LUNSC1
token[3]=]
token[4]=U_KB6_GT11_DV_AL
token[5]=CFN
token[6]=LARM
token[7]=U-KB6-GT11
token[8]=Avvikelselarm

让$ alarmList包含所有这些列:

$alarmList = @(Get-Content -Path '.\A.ALM') | foreach { 
    $token = $_ -split ' +'
    [PSCustomObject]@{
         date = $token[0]
         time = $token[1]
         H2   = $token[2]
         H3   = $token[3]
         H4   = $token[4]
         H5   = $token[5]
         H6   = $token[6]
         H7   = $token[7]
         H8   = $token[8]
    }
}
$alarmList | ft -auto

date       time         H2      H3 H4                 H5  H6   H7                     H8
----       ----         --      -- --                 --  --   --                     --
2018-05-19 00:26:00,551 [LUNSC1 ]  D_TA204_GT1_DV_AL  CFN LARM D_TA204_GT1_Reglerfel
2018-05-19 00:28:01,049 [LUNSC1 ]  D_TA204_GT41_DV_AL CFN LARM D_TA204_GT41_Reglerfel
2018-05-19 00:28:01,049 [LUNSC1 ]  D_TA204_GT31_DV_AL CFN LARM D_TA204_GT31_Reglerfel
2018-05-19 00:28:01,049 [LUNSC1 ]  D_TA204_GT21_DV_AL CFN LARM D_TA204_GT21_Reglerfel
2018-05-19 00:35:19,627 [LUNSC1 ]  U_TA364_GT11_LARM  CFN LARM U_TA364_GT11_LARM
2018-05-19 00:39:56,135 [LUNSC1 ]  U_TA364_GT11_LARM  CFN LARM U_TA364_GT11_LARM
2018-05-19 00:47:12,612 [LUNSC1 ]  U_KB6_GT11_DV_AL   CFN LARM U-KB6-GT11             Avvikelselarm

当然,你可以进一步发挥它:

# $alarmList | Out-Gridview
# $alarmList | Export-csv '.\Output.csv' -NoTypeInformation
$alarmList | Group H4 -NoElement | Select Name,Count

Name               Count
----               -----
D_TA204_GT1_DV_AL      1
D_TA204_GT41_DV_AL     1
D_TA204_GT31_DV_AL     1
D_TA204_GT21_DV_AL     1
U_TA364_GT11_LARM      2
U_KB6_GT11_DV_AL       1

1
投票

您可以使用Select-Object-Index参数选择要提取的行的索引,最后将其存储到Output.txt文件中。

$file = Get-Content .\A.ALM
$file | Select-Object -Index 6,9 | Out-File -FilePath '.\Output.txt'
© www.soinside.com 2019 - 2024. All rights reserved.