Как выбрать строку и вывести только последнюю текстовую строку - PullRequest
1 голос
/ 13 мая 2019

В любом случае мои выходные данные могут искать только последнюю строку каждой строки, которую я ищу?

$String1 = "Oatmeal"
$String2 = "Cake"
$String1Location = "C:\1.txt"

try {
    Select-String -Path $String1Location -Pattern $String1, $String2 -ErrorAction Stop 
}

catch {
    return ""
}

Мой вывод выглядит примерно так:

C:\1.txt:4:Oatmeal
C:\1.txt:6:Cake
C:\1.txt:9:Cake
C:\1.txt:10:Oatmeal

Но я хочу только увидеть

C:\1.txt:9:Cake
C:\1.txt:10:Oatmeal

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 13 мая 2019

Самое простое решение - добавить в IMO | Sort-Object Pattern -Unique
и, если необходимо, | Sort-Object LineNumber, чтобы иметь первоначальный заказ.

$String1 = "Oatmeal"
$String2 = "Cake"
$String1Location = "C:\1.txt"

try {
    Select-String -Path $String1Location -Pattern $String1, $String2 -ErrorAction Stop |
       Sort-Object Pattern -Unique | Sort-Object LineNumber
}

catch {
    return ""
}
0 голосов
/ 13 мая 2019

Это то, чем я закончил, и оно работает:

try {
    Select-String -Path $String1Location -Pattern $String1 -ErrorAction Stop | Where-Object {$_ -match $String1} | Select-Object -Last 1
    Select-String -Path $String1Location -Pattern $String2 -ErrorAction Stop | Where-Object {$_ -match $String2} | Select-Object -Last 1
}
0 голосов
/ 13 мая 2019

Я бы предложил это:

$String1 = "Oatmeal"
$String2 = "Cake"
$String1Location = "C:\1.txt"

Select-String -Path $String1Location -Pattern $string1, $string2 -SimpleMatch | Group-Object Line | ForEach-Object {
    $_.Group | Sort-Object LineNumber | Select-Object -Last 1
}

Или с помощью соответствия регулярному выражению

$StringsToSearch = "Oatmeal","Cake"
$String1Location = "C:\1.txt"

# build the regex
$pattern = '\b(' + (($StringsToSearch | ForEach-Object { [regex]::Escape($_) }) -join '|') + ')\b' 
# this ends up in '\b(Oatmeal|Cake)\b' which means we are looking for these strings as whole string.
# if you also would like to search for strings that contain the search criteria, like 'Pancake',
# then use 
# $pattern = ($StringsToSearch | ForEach-Object { [regex]::Escape($_) }) -join '|'

Select-String -Path $String1Location -Pattern $pattern | Group-Object Line | ForEach-Object {
    $_.Group | Sort-Object LineNumber | Select-Object -Last 1
}

Примечание: если вы хотите, чтобы ваш вывод был отсортирован по номеру строки вв порядке возрастания просто добавьте | Sort-Object LineNumber после последней закрывающей фигурной скобки.

0 голосов
/ 13 мая 2019

Как насчет того, если вы выполните следующее в блоке try.

$found1=Select-String -Path $String1Location -Pattern $String1 -ErrorAction Stop 
$found1[-1]
$found2=Select-String -Path $String1Location -Pattern $String2 -ErrorAction Stop 
$found2[-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...