PowerShell: как удалить столбцы из текстового ввода с разделителями? - PullRequest
1 голос
/ 16 августа 2011

У меня есть текстовый файл с 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] с учетом входных данных, в которых есть строки с разделенными данными по n столбцам в каждом?

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Вот общее решение:

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 голосов
/ 16 августа 2011

Считайте содержимое файла, преобразуйте его в 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
2 голосов
/ 16 августа 2011

Один из способов:

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

(заменить 2 на n-1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...