我有一个文本文件,其中包含由空格分隔的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}的分隔数据每个列?
答案 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