มี Windows เทียบเท่ากับ Unix uniq หรือไม่?


17

ฉันต้องการลบบรรทัดที่ซ้ำกันออกจากไฟล์ข้อความมันใช้งานง่ายใน Linux

cat file.txt |sort | uniq

เมื่อ file.txt มี

aaa
bbb
aaa
ccc

มันจะออก

aaa
bbb
ccc

มี Windows ที่เทียบเท่าหรือไม่ หรือวิธีนี้ใน Windows วิธี?


10
บน Unix คุณสามารถเขียนมันเป็นsort -u file.txt
jfs

1
นอกจากนี้ยังมี WSL ซึ่งใช้งานได้ดีตราบใดที่สิ่งต่าง ๆ นี้เกิดขึ้น
user2813274

บางทีคุณต้องการตั้งค่าบางอย่างเป็นวิธีแก้ปัญหาหากคุณไม่มีคำถามเพิ่มเติม
davidbaumann

คำตอบ:


31

Sort-Objectcmdlet ใน PowerShell สนับสนุน-Uniqueสวิทช์ที่จะเป็นสิ่งเดียวกันเป็นuniq:

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

แน่นอนเนื่องจากมีนามแฝงใน PowerShell คุณสามารถเขียน:

type file.txt | sort -unique

นอกจากนี้ยังมี/uniqueสวิตช์ที่ไม่มีเอกสารในsort.exeWindows 10 ดังนั้นควรทำงานในพร้อมท์คำสั่ง:

type file.txt | sort /unique

1
ฉันไม่คิดว่าคำสั่ง Windows ( sort.exe) รองรับสิ่งนี้; ดูเหมือนว่าคุณสมบัติของ PowerShell ในตัว
Ben Voigt

1
พิมพ์ unsorted.txt | sort -unique> Sort.txt สิ่งนี้ทำงานได้จริงภายใต้ win10 และเขียนค่าเฉพาะลงในไฟล์ใหม่
Lixas

7
@BenVoigt น่าแปลกใจที่type file.txt | sort /uniqueจะทำงานร่วมกับที่ไม่มีเอกสารสวิทช์/uniqueของsort.exeยูทิลิตี้ (อย่างน้อยใน Windows 10) ในอีกด้านหนึ่งคุณพูดถูกที่มีตัวอย่างคือ PowerShell Get-Content file.txt | Sort-Object -uniqueอันที่จริง
JosefZ

1
sort /uniqueข้อผิดพลาดกับInvalid switch.ใน Windows 7 Enterprise
Don Cruickshank

1
@JosefZ คำตอบจะระบุสวิตช์โดยใช้ "/" (ฟอร์เวิร์ดสแลช) และไม่ใช่เส้นประ forward-slash เป็นมาตรฐาน Windows สำหรับคำสั่งใน CMD และคำสั่งบางคำสั่งไม่อนุญาตให้แทนที่ขีดกลางสำหรับเครื่องหมายทับบนสวิตช์คำสั่ง docs.microsoft.com/en-us/windows-server/administr/…สำหรับการอ้างอิงอย่างรวดเร็วแสดงให้เห็นอย่างต่อเนื่อง ด้านบนเป็นคำตอบที่ดีการแบ่งปันชิ้นอาหารอันโอชะที่ไม่เป็นที่รู้จักกันโดยทั่วไป แต่ฉันไม่สามารถจินตนาการได้ว่าทำไมสวิตช์ "/ unique" จึงไม่มีเอกสารเนื่องจากมีประโยชน์มาก
Debra

6

มีพอร์ตของ uniq ที่ทำงานเหมือนกับรุ่น gnu / coreutils ผมเองใช้รูปแบบจากGOWแต่คอมไพล์สำหรับ Windows มีนัยสำคัญรุ่นที่ใหม่กว่า ไม่จำเป็นต้องมี cygwin สำหรับสิ่งที่คุณต้องการค้นหาใน / usr / bin

เนื่องจากแพ็คเกจเหล่านี้มี cat, sort และ uniq - เวิร์กโฟลว์ของคุณควรเหมือนกันเป็นส่วนใหญ่และcat file.txt |sort | uniqควรทำงานเหมือนกัน


2

คุณสามารถเขียนคำสั่ง "uniq" ได้อย่างง่ายดายด้วยตัวเอง บันทึกสิ่งนี้ในไฟล์แบตช์ "uniq.cmd" ที่ใดที่หนึ่งใน% พา ธ % ของคุณสามารถค้นหาได้ (เช่นใน% windir% \ system32) รุ่นนี้ไม่คำนึงถึงขนาดตัวพิมพ์:

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

สิ่งนี้ใช้ได้กับ "uniq mytextfile" เช่นเดียวกับ "cat mytextfile | uniq"; เนื่องจากอินพุตและอาร์กิวเมนต์ทั้งหมดถูกส่งผ่านไปยังคำสั่ง sort

เริ่มต้นด้วย Windows 7 คุณอาจต้องการรุ่นที่อ่อนไหวมาก ๆ (ความแตกต่างของ ist undocumented switch คือ "sort / C" และไม่ใช่ "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
)

ดี แต่มันมีข้อบกพร่อง ขณะนี้มันล้มเหลวด้วยเนื้อหาเช่น/?, ON, หรือone ^ caret bang!แต่นั่นสามารถแก้ไขได้โดยใช้เทคนิคการขยายการสลับที่ล่าช้าและecho(ดู: Dostips: ECHO ล้มเหลวที่จะให้ข้อความหรือบรรทัดว่าง
Jeb

ขอบคุณเหตุผลที่ใช้เทคนิคการขยายการสลับที่ล่าช้าไม่ชัดเจนหรือทำเครื่องหมายไว้ ฉันแก้ไขตัวอย่างของฉันให้สมบูรณ์แบบ (เกือบ) แล้ว
Tom Stein

0

นอกจากคำตอบของ Yu Jiaao คุณสามารถเรียกใช้sort-objectpowershell cmdlet ใน command prompt ดังนี้:

type file.txt | powershell -nop "$input | sort -unique"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.