Apakah ada Windows yang setara dengan Unix uniq?

17

Saya perlu menghapus duplikat baris dari file teks, sederhana menggunakan Linux

cat file.txt |sort | uniq

saat file.txt berisi

aaa
bbb
aaa
ccc

Ini akan menampilkan

aaa
bbb
ccc

Apakah ada yang setara dengan Windows? atau bagaimana melakukan ini dengan cara Windows?

Yu Jiaao
sumber
10
Di Unix, Anda bisa menuliskannya sebagaisort -u file.txt
jfs
1
Ada juga WSL yang bekerja dengan cukup baik sejauh ini
user2813274
Mungkin Anda ingin menetapkan sesuatu sebagai solusi, jika Anda tidak memiliki pertanyaan lebih lanjut?
davidbaumann

Jawaban:

31

The Sort-Objectcmdlet di PowerShell mendukung -Uniquesaklar yang melakukan hal yang sama seperti uniq:

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

Tentu saja, karena keberadaan alias di PowerShell, Anda juga dapat menulis:

type file.txt | sort -unique

Selain itu, ada /uniqueperalihan tidak berdokumen pada sort.exeWindows 10, jadi, ini harus berfungsi di Command Prompt:

type file.txt | sort /unique
Yu Jiaao
sumber
1
Saya tidak berpikir perintah Windows ( sort.exe) mendukung ini; sepertinya fitur built-in PowerShell.
Ben Voigt
1
ketik unsorted.txt | sort -unique> sort.txt Ini benar-benar berfungsi di bawah win10 dan menuliskan nilai unik ke file baru
Lixas
7
@BenVoigt mengejutkan, type file.txt | sort /uniquebekerja dengan tidak berdokumen beralih /uniquedari sort.exeutilitas (setidaknya pada Windows 10). Di sisi lain, Anda benar bahwa contoh yang diberikan adalah PowerShell Get-Content file.txt | Sort-Object -unique.
JosefZ
1
sort /uniquekesalahan dengan Invalid switch.pada Windows 7 Enterprise.
Don Cruickshank
1
@ JosefZ, jawabannya menentukan saklar menggunakan "/" (garis miring) dan tidak putus; forward-slash adalah standar Windows untuk perintah dalam CMD, dan tidak semua perintah mengizinkan penggantian tanda hubung untuk slash on command switches. docs.microsoft.com/en-us/windows-server/administration/… untuk referensi cepat secara konsisten menunjukkan garis miring. Di atas adalah jawaban yang bagus, berbagi berita gembira yang tidak diketahui umum, meskipun saya tidak bisa membayangkan mengapa saklar "/ unik" tidak didokumentasikan karena sangat berguna.
Debra
6

Ada port uniq yang bekerja secara identik dengan versi gnu / coreutils. Saya pribadi menggunakan variasi dari GOW tetapi git untuk windows memiliki versi yang jauh lebih baru . Cygwin tidak diperlukan meskipun untuk yang terakhir Anda perlu mencari di / usr / bin

Karena paket-paket ini juga mengandung cat, sortir dan uniq - alur kerja Anda sebagian besar harus identik, dan cat file.txt |sort | uniqsebagian besar akan berfungsi secara identik

Journeyman Geek
sumber
2

Anda dapat dengan mudah menulis perintah "uniq" sendiri. Simpan ini dalam file batch "uniq.cmd" di suatu tempat di% path% Anda dapat menemukannya (misalnya dalam% windir% \ system32). Versi ini TIDAK peka huruf besar-kecil:

@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
)

Ini berfungsi dengan "uniq mytextfile" serta "cat mytextfile | uniq"; karena semua input dan argumen hanya diteruskan ke perintah sortir.

Dimulai dengan Windows 7, Anda mungkin menginginkan versi yang benar-benar case-sensitif (perbedaannya adalah saklar tidak berdokumen "sort / C" dan no "if / i"):

@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
)
Tom Stein
sumber
Bagus, tetapi memiliki beberapa kekurangan. Saat ini gagal dengan seperti konten /?, ON, one ^ caretatau bang!. Tapi itu bisa diselesaikan dengan menggunakan teknik ekspansi toggling tertunda dan echo(lihat: Dostips: ECHO. GAGAL untuk memberikan teks atau baris kosong
jeb
Terima kasih, alasan untuk menggunakan teknik ekspansi toggling tertunda belum jelas atau ditandai. Saya mengedit contoh saya untuk menjadi (hampir) sempurna sekarang.
Tom Stein
0

Tambahan untuk jawaban Yu Jiaao. Anda dapat memanggil sort-objectcmdlet PowerShell di command prompt seperti:

type file.txt | powershell -nop "$input | sort -unique"
snipsnipsnip
sumber