Powershell'deki nesneleri üçüncü sütuna göre nasıl sıralayabilirim?


2

Bunun gibi bir metin dosyası var:

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

Ve Powershell'de listeyi üçüncü sütuna göre sıralamak istiyorum, ancak Sort-Objectbu listeyi dosya ismine göre sıralıyorum ( /her satırdaki son karakterden sonraki ilk karaktere göre ).

Böyle bir şey elde etmek isterim:

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

Bu yüzden de dahil olmak üzere bir dize olarak üçüncü sütuna göre sıralamak istiyorum ., /karakterler.


Düzenleme # 1: Bazı ilgili kodlar

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

Düzenleme # 2: Çözüm

Sorunun ne olduğunu anladım. Sıralamadan sonra göreceli yolları ekledim. Yani doğru kod:

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

Şimdi sadece kodu biraz temizlemem gerekiyor, çünkü üç kez dosya yazmak gerçekten çok çirkin. :)


O zaman sorunun ne olduğundan emin değilim. Gönderdiğin kodu aldım, koştum ve sıraladım.
EBGreen

@EBGreen Yardımınız için teşekkürler. Ne yapacağımı bilmiyorum ama cevabını kabul ediyorum ya da kendi sorum için bir cevap yaz, çünkü bana çok yardımcı oldun ve sanırım itibarı hak ediyorsun.
szantaii

Meh, temsilci için endişelenmiyorum. Benim tercihim, çözüm, neden ve nerede hakkında güzel bir yazı yazmanız olabilir.
EBGreen

Tamam, o zaman yapacağım.
szantaii

Yanıtlar:


2

Böyle bir şey dene:

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

Girdiyi iyi tanımlanmış sütunlara sahip olduğu sürece ölçütleri karşıladığı için orijinal cevabımı bırakacağım. Yorumlara dayanarak, çözüm dizilimi oluştururken sıralamaktır:

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

Teşekkürler. Bu neredeyse işe yarıyor ancak boşluk karakterleri içeren dosya isimleri ve dizin isimleri bu konuyu karıştırıyor.
szantaii

O zaman uygun sütunların yok.
EBGreen

Metin dosyasını tam olarak nasıl oluşturuyorsunuz?
EBGreen

Aslında cksum kullanıyorum:$allfiles=get-childitem $inputpath -rec | Where-Object {!($_.psiscontainer)} cd $inputpath foreach ($file in $allfiles) {cksum.exe $file | Out-File -Append $pathtooutputfile}
szantaii

Düzenleme için teşekkürler, ama ben bunu kullanıyorum. Soruyu düzenledim ve daha fazla kod ekledim. Her neyse, teşekkürler.
szantaii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.