Printout only 3rd section of a line

Welcome Forums General PowerShell Q&A Printout only 3rd section of a line

This topic contains 3 replies, has 3 voices, and was last updated by

 
Participant
1 week, 5 days ago.

  • Author
    Posts
  • #181716

    Participant
    Topics: 1
    Replies: 1
    Points: 14
    Rank: Member

    I see a lot of "grab last word", "grab first/last X characters" or "grab lines that contain XXX" however I've been unable to find a solution here for my problem.
    For example, my text file contains thousands of  lines like:
    [0000001] item_title apple_juice_2L_concentrate 0x000581
    [0000002] item_description 98%_reconstituted_apple_juice 0x00585
    [0000003] item_title orange_juice_2L_natural 0x000679
    [0000004] item_description 100%_fresh_squeeze_orange_juice 0x00985
    [0000005] item_title apple_juice_1L_natural 0x000429
    [0000006] item_description 100%_natural_apple_juice_cloudy 0x00587

    how would I achieve a printout like this while cutting out the junk i dont want like the [0000001], item_title and the 0x000581
    apple_juice_2L_concentrate
    apple_juice_1L_natural

    I'm currently using:
    Get-Content -Path H:\"inventory management"\juice\juices.txt | Where-Object {$_ -like '*item_title apple_juice*'}

    which returns
    [0000001] item_title apple_juice_2L_concentrate 0x000581
    [0000005] item_title apple_juice_1L_natural 0x000429

    All I want to do is adjust my code to not printout the entire line as it does now, but just the 3rd section.

    Appreciate your time!

  • #181737

    Participant
    Topics: 20
    Replies: 34
    Points: 172
    Helping Hand
    Rank: Participant

    The only way is Regex.

    Write regex string to match the content.

    Instead of like parameter use match parameter to use regex string.

    You have to use foreach loop to iterate line by line and match the data. Also to get the desired output you need to create custom object as well.

  • #181746

    Participant
    Topics: 3
    Replies: 66
    Points: 336
    Helping Hand
    Rank: Contributor

    As Sankhadip suggests, regex is your friend for this type of problem. You should read through Microsoft's regex documentation page. For this particular instance, you can solve the problem easily with -split.

    Here's an example, modifying your code:

    Get-Content -Path H:\"inventory management"\juice\juices.txt | (Where-Object {$_ -like '*item_title apple_juice*'} -split ' ')[2]

    What this does is split your output string

    [0000001] item_title apple_juice_2L_concentrate 0x000581

    into individual strings based on the selected split character(s). In this case, we are splitting the string at spaces, hence

    -split ' '

    which is actually a very simple regex string. The result is the following strings:

    [0000001]
    item_title
    apple_juice_2L_concentrate
    0x000581

    which are stored in an array for convenience. The

    [2]

    at the end selects the third element in the array, which is the output that you want:

    apple_juice_2L_concentrate
  • #181767

    Participant
    Topics: 1
    Replies: 1
    Points: 14
    Rank: Member

    As Sankhadip suggests, regex is your friend for this type of problem. You should read through Microsoft's regex documentation page. For this particular instance, you can solve the problem easily with -split. Here's an example, modifying your code:

    Get-Content -Path H:\"inventory management"\juice\juices.txt | (Where-Object {$_ -like '*item_title apple_juice*'} -split ' ')[2]

    This returned this error:

    Expressions are only allowed as the first element of a pipeline.

    This worked though, thanks anyway:

    $InStuff = Get-Content -Path 'H:\inventory management\juice\juices.txt' 
    
    $TargetPhrase = 'item_title'
    
    $Results = $InStuff -match $TargetPhrase |
        ForEach-Object {
            $_.Split(' ')[2]
            }
    
    $Results -match 'apple_juice'

     

You must be logged in to reply to this topic.