Извлечение определенных токенов из строк в файл и экспорт в другой файл - PullRequest
0 голосов
/ 25 июня 2018

Мой файл данных 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

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

for /f считает последовательные разделители (по умолчанию это пробел) как один

  • для репликации этого поведения используйте -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
0 голосов
/ 25 июня 2018

Вы можете выбрать индекс строки, которую вы хотите извлечь с помощью параметров Select-Object и -Index, и, наконец, сохранить ее в файле Output.txt.

$file = Get-Content .\A.ALM
$file | Select-Object -Index 6,9 | Out-File -FilePath '.\Output.txt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...