Unix uniq'e eşdeğer bir Windows var mı?


17

Bir metin dosyasından yinelenen satırları kaldırmak gerekir, Linux kullanarak basit

cat file.txt |sort | uniq

file.txt içerdiğinde

aaa
bbb
aaa
ccc

Çıktı verecek

aaa
bbb
ccc

Windows eşdeğeri var mı? ya da bu nasıl bir Windows yolunda?


10
Unix'te, şöyle yazabilirsinizsort -u file.txt
jfs

1
Ayrıca bu tür şeyler giderken oldukça iyi çalışan WSL var
user2813274

Başka sorunuz yoksa belki bir şeyi çözüm olarak ayarlamak istersiniz?
davidbaumann

Yanıtlar:


32

Sort-ObjectPowerShell cmdlet bir destek -Uniqueolarak aynı şeyi yapar anahtarı uniq:

Get-Content file.txt | Sort-Object -unique

Elbette, PowerShell'de takma adların varlığı nedeniyle, şunları da yazabilirsiniz:

type file.txt | sort -unique

Ayrıca, Windows 10'da belgelenmemiş bir /uniqueanahtar vardır sort.exe, bu nedenle Komut İstemi'nde çalışması gerekir:

type file.txt | sort /unique

1
Windows komutunun ( sort.exe) bunu desteklediğini düşünmüyorum ; PowerShell yerleşiminin bir özelliğine benziyor.
Ben Voigt

1
unsorted.txt yazın | sort -unique> sort.txt Bu gerçekten win10 altında çalışıyor ve benzersiz değerleri yeni dosyaya
yazdı

7
@BenVoigt şaşırtıcı bir şekilde, type file.txt | sort /uniqueçalışan kayıt dışı anahtarı /uniquearasında sort.exe(veya Windows 10, en az) programı. Diğer taraftan, Get-Content file.txt | Sort-Object -uniqueaslında sağlanan örneğin PowerShell olduğunu haklısın .
JosefZ

1
sort /uniqueInvalid switch.7 Enterprise ile ilgili hatalar .
Don Cruickshank

1
@JosefZ, yanıt anahtarı değil "/" (eğik çizgi) kullanarak belirtir; eğik çizgi, CMD'deki komutlar için Windows standardıdır ve tüm komutlar, eğik çizgi komut anahtarları için tire işareti kullanılmasına izin vermez. docs.microsoft.com/en-us/windows-server/administration/… hızlı başvuru için sürekli eğik çizgi gösterir. Yukarıdakiler, yaygın olarak bilinmeyen bir tidbit paylaşan harika bir yanıttı, ancak "/ unique" anahtarının neden bu kadar kullanışlı olduğundan belgelenmediğini hayal edemiyorum.
Debra

6

GNU / coreutils sürümleriyle aynı şekilde çalışan uniq bağlantı noktaları vardır. Ben şahsen GOW varyasyon kullanın ama pencereler için git önemli ölçüde yeni bir sürümü var . / Usr / bin içine bakmanız gereken ikinci şey için cygwin gerekmez

Bu paketler ayrıca kedi, sıralama ve tek parça içerdiğinden - iş akışınız çoğunlukla aynı cat file.txt |sort | uniqolmalı ve çoğunlukla aynı şekilde çalışmalıdır


2

Kolayca "uniq" komutunu kendiniz yazabilirsiniz. Bunu,% path% dosyanızın herhangi bir yerinde "uniq.cmd" adlı bir toplu iş dosyasına kaydedin (örneğin,% windir% \ system32 içinde). Bu sürüm büyük / küçük harfe duyarlı DEĞİLDİR:

@echo off
setlocal DisableDelayedExpansion
set "prev="
for /f "delims=" %%F in ('sort %*') do (
    rem "set" needs to be done without delayed expansion
    set "line=%%F"
    setlocal EnableDelayedExpansion
        set "line=!line:<=<!"
        if /i "!prev!" neq "!line!" echo(!line!
        set "prev=!line!"
    endlocal
)

Bu "uniq mytextfile" ve "cat mytextfile | uniq" ile çalışır; çünkü tüm girdi ve argümanlar sort komutuna aktarılır.

Windows 7'den başlayarak, gerçekten büyük / küçük harfe duyarlı bir sürüm isteyebilirsiniz (fark "belgelenmemiş anahtar" sort / C "ve no" if / i "yok):

@echo off
setlocal DisableDelayedExpansion
set "prev="
for /f "delims=" %%F in ('sort /C %*') do (
    rem "set" needs to be done without delayed expansion
    set "line=%%F"
    setlocal EnableDelayedExpansion
        set "line=!line:<=<!"
        if "!prev!" neq "!line!" echo(!line!
        set "prev=!line!"
    endlocal
)

Güzel, ama bazı kusurları var. Şu anda içeriği gibi başarısız olur /?, ON, one ^ caretveya bang!. Ama bu kullanılarak çözülebilir değiştirilirken gecikmiş genişletme tekniği ve echo(: bkz Dostips: ECHO. Metin veya boş satır
veremez

Geçiş yapan gecikmeli genişletme tekniğini kullanmanın nedeni belli değildi veya belirgin değildi. Örneklerimi şimdi (neredeyse) mükemmel olacak şekilde düzenledim.
Tom Stein

1

Yu Jiaao'nun cevabına ek. sort-objectPowershell cmdlet'ini aşağıdaki gibi bir komut isteminde çağırabilirsiniz :

type file.txt | powershell -nop "$input | sort -unique"
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.