Como posso classificar objetos pela terceira coluna no Powershell?


2

Eu tenho um arquivo de texto como este:

4108689096 2531 ./ssss/132432.odt
481446057 2293 ./abc/a.txt
3157353085 1096 ./dsjvbjf/c.docx
653380669 1824 ./bcd/x.avi

E eu gostaria de conseguir no Powershell classificar a lista pela terceira coluna, mas Sort-Objectparece classificá-la pelo nome do arquivo (pelo primeiro caractere após o último /em cada linha) o que eu fizer.

Eu gostaria de conseguir algo assim:

481446057 2293 ./abc/a.txt
653380669 1824 ./bcd/x.avi
3157353085 1096 ./dsjvbjf/c.docx
4108689096 2531 ./ssss/132432.odt

Então eu gostaria de classificar pela terceira coluna como uma string incluindo ., /caracteres.


Edição nº 1: algum código relevante

# Gets a relative path based on a base and a full path (to file)
# 
# Usage: RelativePath <path to file> <base path>
# 
# Note: Specifying arguments is mandatory.
function global:RelativePath
{
    param
    (
        [string]$path = $(throw "Missing: path"),
        [string]$basepath = $(throw "Missing: base path")
    )

    return [system.io.path]::GetFullPath($path).SubString([system.io.path]::GetFullPath($basepath).Length + 1)
}

# Calculates CRC checksums for all files in the specified directory and writes
# the checksums to a file
# 
# Usage: CRCSumAll <path to folder to check> <file conatining checksums>
# 
# Note: Specifying arguments is mandatory.
function global:CRCSumAll
{
    param($inputpath,$outputfile)

    $allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} | Sort-Object Name

    new-item -force -type file $outputfile

    cd $inputpath
    foreach ($file in $allfiles)
    {
        $relfile=RelativePath $file.fullname $inputpath
        $relfile=$relfile -replace("\\","/")
        $relfile="./$relfile"
        cksum.exe $relfile | Out-File -Encoding OEM -Append $outputfile
    }
}

Edição # 2: Solução

Eu percebi qual era o problema. Eu adicionei os caminhos relativos após a classificação. Portanto, o código correto é:

function global:CRCSumAll
{
    param($inputpath,$outputfile)

    $allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} #| Sort-Object Name

    new-item -force -type file $outputfile

    cd $inputpath
    foreach ($file in $allfiles)
    {
        $relfile=RelativePath $file.fullname $inputpath
        $relfile=$relfile -replace("\\","/")
        $relfile="./$relfile"
        $relfile | Out-File -Encoding OEM -Append $outputfile
    }

    $sorted=Get-Content $outputfile | Sort-Object
    new-item -force -type file $outputfile
    $sorted | Out-File -Encoding OEM -Append $outputfile

    $forcksum=Get-Content $outputfile
    new-item -force -type file $outputfile
    $forcksum | Foreach-Object { cksum.exe $_ | Out-File -Encoding OEM -Append $outputfile}
}

Agora só tenho que limpar o código um pouco, porque escrever um arquivo três vezes é realmente feio. :)


Não sei ao certo qual é o problema. Peguei o código que você postou, executei e obtive um resultado classificado.
precisa

Obrigado pela ajuda @EBGreen. Embora eu não tenha certeza do que fazer, aceite sua resposta ou escreva uma resposta para minha própria pergunta, porque você me ajudou muito e acho que você merece a reputação.
Szantaii

meh, não estou preocupado com o representante. Minha preferência é que você faça uma boa redação da solução, dos porquês e dos motivos.
precisa

Ok, eu vou fazer isso então.
precisa saber é o seguinte

Respostas:


2

Tente algo como isto:

Import-CSV C:\Path\To\File.txt -Header ('foo', 'bar', 'wombat') -delimiter ' ' | Sort-Object wombat

Deixarei minha resposta original, pois ela atende aos critérios, desde que a entrada tenha colunas bem definidas. Com base nos comentários, a solução é classificar a matriz na criação:

$allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} | Sort-Object Name
cd $inputpath
foreach ($file in $allfiles) {cksum.exe $file | Out-File -Append $pathtooutputfile}

Obrigado. Isso quase funciona, mas nomes de arquivos e diretórios que contêm caracteres de espaço atrapalham a coisa.
precisa saber é o seguinte

Então você não tem colunas adequadas.
precisa

Como exatamente você está gerando o arquivo de texto?
precisa

Na verdade eu uso cksum:$allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} cd $inputpath foreach ($file in $allfiles) {cksum.exe $file | Out-File -Append $pathtooutputfile}
szantaii

Obrigado pela edição, mas é isso que eu tenho usado. Editei a pergunta e adicionei mais código. De qualquer forma, obrigado.
simples
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.