开发者

PowerShell: How to remove columns from delimited text input?

开发者 https://www.devze.com 2023-03-28 21:05 出处:网络
I have a text file with 5 columns of text delimited by whitespace. For example: 10 45 5 23 78 89 3 56 12 56

I have a text file with 5 columns of text delimited by whitespace. For example:

10 45 5 23 78
89 3 56 12 56
999 4 67 93 5

Using PowerShell, how do I remove the r开发者_JAVA百科ightmost two columns? The resulting file should be:

10 45 5
89 3 56
999 4 67

I can extract the individual items using the -split operator. But, the items appear on different lines and I do not see how I can get them back as 3 items per line.

And to make the question more generic (and helpful to others): How to use PowerShell to remove the data at multiple columns in the range [0,n-1] given an input that has lines with delimited data of n columns each?


Read the file content, convert it to a csv and select just the first 3 columns:

Import-Csv .\file.txt -Header col1,col2,col3,col4,col5 -Delimiter ' ' | Select-Object col1,col2,col3

If you want just the values (without a header):

Import-Csv .\file.txt -Header col1,col2,col3,col4,col5 -Delimiter ' ' | Select-Object col1,col2,col3 | Format-Table -HideTableHeaders -AutoSize

To save back the results to the file:

(Import-Csv .\file.txt -Header col1,col2,col3,col4,col5 -Delimiter ' ') | Foreach-Object { "{0} {1} {2}" -f $_.col1,$_.col2,$_.col3} | Out-File .\file.txt

UPDATE:

Just another option:

(Get-Content .\file.txt) | Foreach-Object { $_.split()[0..2] -join ' ' } | Out-File .\file.txt


One way is:

gc input.txt | %{[string]::join(" ",$_.split()[0..2]) } | out-file output.txt

(replace 2 by n-1)


Here is the generic solution:

param
(
    # Input data file
    [string]$Path = 'data.txt',
    # Columns to be removed, any order, dupes are allowed
    [int[]]$Remove = (4, 3, 4, 3)
)

# sort indexes descending and remove dupes
$Remove = $Remove | Sort-Object -Unique -Descending

# read input lines
Get-Content $Path | .{process{
    # split and add to ArrayList which allows to remove items
    $list = [Collections.ArrayList]($_ -split '\s')

    # remove data at the indexes (from tail to head due to descending order)
    foreach($i in $Remove) {
        $list.RemoveAt($i)
    }

    # join and output
    $list -join ' '
}}
0

精彩评论

暂无评论...
验证码 换一张
取 消