PowerShell:如何从分隔文本输入中删除列?

时间:2011-08-16 05:35:04

标签: powershell split

我有一个文本文件,其中包含由空格分隔的5列文本。例如:

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

使用 PowerShell ,如何删除最右边的两个?生成的文件应为:

10 45 5
89 3 56
999 4 67

我可以使用-split运算符提取单个项目。但是,这些项目出现在不同的行上,我不知道如何将它们作为每行3个项目取回。

并使问题更通用(并对其他人有帮助):如果使用PowerShell删除[0,n-1]范围内多个列的数据,并且输入的行包含{{1}的分隔数据每个列?

3 个答案:

答案 0 :(得分:2)

一种方法是:

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

(将n替换为2)

答案 1 :(得分:2)

以下是通用解决方案:

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 ' '
}}

答案 2 :(得分:2)

读取文件内容,将其转换为csv并仅选择前3列:

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

如果您只想要值(没有标题):

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

将结果保存到文件中:

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

更新:

另一种选择:

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