Có Windows tương đương với uniq Unix không?


17

Tôi cần xóa các dòng trùng lặp khỏi một tệp văn bản, nó đơn giản trong Linux bằng cách sử dụng

cat file.txt |sort | uniq

khi file.txt chứa

aaa
bbb
aaa
ccc

Nó sẽ xuất

aaa
bbb
ccc

Có tương đương Windows không? hoặc làm thế nào để làm điều này theo cách Windows?


10
Trên Unix, bạn có thể viết nó dưới dạngsort -u file.txt
jfs

1
Ngoài ra còn có WSL hoạt động khá tốt cho đến khi loại công cụ này hoạt động
user2813274

Có lẽ bạn muốn đặt một cái gì đó làm giải pháp, nếu bạn không có thêm câu hỏi nào?
davidbaumann

Câu trả lời:


31

Các Sort-Objectlệnh trong PowerShell hỗ trợ một -Uniquecông tắc mà làm điều tương tự như uniq:

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

Tất nhiên, do sự hiện diện của các bí danh trong PowerShell, bạn cũng có thể viết:

type file.txt | sort -unique

Ngoài ra, có một /uniquecông tắc không có giấy tờ trong sort.exeWindows 10, do đó, công cụ này sẽ hoạt động trong Dấu nhắc lệnh:

type file.txt | sort /unique

1
Tôi không nghĩ lệnh Windows ( sort.exe) hỗ trợ điều này; nó trông giống như một tính năng của nội dung PowerShell.
Ben Voigt

1
gõ unsort.txt | sort -unique> sort.txt Điều này thực sự hoạt động theo win10 và ghi các giá trị duy nhất vào tệp mới
Lixas

7
@BenVoigt đáng ngạc nhiên, type file.txt | sort /uniquelàm việc với không có giấy tờ chuyển đổi /uniquecủa sort.exetiện ích (ít nhất là trên Windows 10). Mặt khác Get-Content file.txt | Sort-Object -unique, trên thực tế , bạn đã đúng, ví dụ được cung cấp là PowerShell .
JosefZ

1
sort /uniquelỗi với Invalid switch.Windows 7 Enterprise.
Don Cruickshank

1
@JosefZ, câu trả lời chỉ định công tắc sử dụng "/" (dấu gạch chéo) và không dấu gạch ngang; dấu gạch chéo là tiêu chuẩn Windows cho các lệnh trong CMD và không phải tất cả các lệnh đều cho phép thay thế dấu gạch ngang cho dấu gạch chéo trên các công tắc lệnh. docs.microsoft.com/en-us/windows-server/ad dùng / từ để tham khảo nhanh liên tục hiển thị dấu gạch chéo. Trên đây là một câu trả lời tuyệt vời, chia sẻ một mẩu tin không phổ biến, mặc dù tôi không thể tưởng tượng được tại sao công tắc "/ unique" không có giấy tờ vì nó rất hữu ích.
Debra

6

Có các cổng uniq hoạt động giống hệt với các phiên bản gnu / coreutils. Cá nhân tôi sử dụng biến thể từ GOW nhưng git cho windows có phiên bản mới hơn đáng kể . Không yêu cầu cygwin mặc dù sau này bạn cần tìm trong / usr / bin

Vì các gói này cũng chứa cat, sort và uniq - quy trình làm việc của bạn nên giống hệt nhau và cat file.txt |sort | uniqnên hoạt động chủ yếu giống hệt nhau


2

Bạn có thể dễ dàng viết lệnh "uniq" một mình. Lưu tệp này trong một tệp bó "uniq.cmd" ở đâu đó trong% path% của bạn có thể tìm thấy nó (ví dụ: trong% Windir% \ system32). Phiên bản này KHÔNG phân biệt chữ hoa chữ thường:

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

Điều này hoạt động với "uniq mytextfile" cũng như "cat mytextfile | uniq"; vì tất cả các đầu vào và đối số chỉ đơn giản được truyền cho lệnh sort.

Bắt đầu với Windows 7, bạn có thể muốn có một phiên bản phân biệt chữ hoa chữ thường (sự khác biệt giữa chuyển đổi không có giấy tờ "sort / C" và không "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
)

Đẹp, nhưng nó có một số sai sót. Nó hiện không thành công với giống như nội dung /?, ON, one ^ carethoặc bang!. Nhưng điều đó có thể được giải quyết bằng cách sử dụng kỹ thuật mở rộng bị trì hoãnecho(xem: Dostips: ECHO. KHÔNG để cung cấp cho văn bản hoặc dòng trống
Jeb

Cảm ơn, lý do cho việc sử dụng kỹ thuật mở rộng bị trì hoãn đã không rõ ràng cũng không được đánh dấu. Tôi đã chỉnh sửa các ví dụ của mình để trở nên (gần như) hoàn hảo.
Tom Stein

0

Ngoài câu trả lời của Yu Jiaao. Bạn có thể gọi sort-objectlệnh ghép ngắn powershell trong dấu nhắc lệnh như:

type file.txt | powershell -nop "$input | sort -unique"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.