ฉันต้องการลบบรรทัดที่ซ้ำกันออกจากไฟล์ข้อความมันใช้งานง่ายใน Linux
cat file.txt |sort | uniq
เมื่อ file.txt มี
aaa
bbb
aaa
ccc
มันจะออก
aaa
bbb
ccc
มี Windows ที่เทียบเท่าหรือไม่ หรือวิธีนี้ใน Windows วิธี?
ฉันต้องการลบบรรทัดที่ซ้ำกันออกจากไฟล์ข้อความมันใช้งานง่ายใน Linux
cat file.txt |sort | uniq
เมื่อ file.txt มี
aaa
bbb
aaa
ccc
มันจะออก
aaa
bbb
ccc
มี Windows ที่เทียบเท่าหรือไม่ หรือวิธีนี้ใน Windows วิธี?
คำตอบ:
Sort-Object
cmdlet ใน PowerShell สนับสนุน-Unique
สวิทช์ที่จะเป็นสิ่งเดียวกันเป็นuniq
:
Get-Content file.txt | Sort-Object -unique
แน่นอนเนื่องจากมีนามแฝงใน PowerShell คุณสามารถเขียน:
type file.txt | sort -unique
นอกจากนี้ยังมี/unique
สวิตช์ที่ไม่มีเอกสารในsort.exe
Windows 10 ดังนั้นควรทำงานในพร้อมท์คำสั่ง:
type file.txt | sort /unique
sort.exe
) รองรับสิ่งนี้; ดูเหมือนว่าคุณสมบัติของ PowerShell ในตัว
type file.txt | sort /unique
จะทำงานร่วมกับที่ไม่มีเอกสารสวิทช์/unique
ของsort.exe
ยูทิลิตี้ (อย่างน้อยใน Windows 10) ในอีกด้านหนึ่งคุณพูดถูกที่มีตัวอย่างคือ PowerShell Get-Content file.txt | Sort-Object -unique
อันที่จริง
sort /unique
ข้อผิดพลาดกับInvalid switch.
ใน Windows 7 Enterprise
มีพอร์ตของ uniq ที่ทำงานเหมือนกับรุ่น gnu / coreutils ผมเองใช้รูปแบบจากGOWแต่คอมไพล์สำหรับ Windows มีนัยสำคัญรุ่นที่ใหม่กว่า ไม่จำเป็นต้องมี cygwin สำหรับสิ่งที่คุณต้องการค้นหาใน / usr / bin
เนื่องจากแพ็คเกจเหล่านี้มี cat, sort และ uniq - เวิร์กโฟลว์ของคุณควรเหมือนกันเป็นส่วนใหญ่และcat file.txt |sort | uniq
ควรทำงานเหมือนกัน
คุณสามารถเขียนคำสั่ง "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 ล้มเหลวที่จะให้ข้อความหรือบรรทัดว่าง
นอกจากคำตอบของ Yu Jiaao คุณสามารถเรียกใช้sort-object
powershell cmdlet ใน command prompt ดังนี้:
type file.txt | powershell -nop "$input | sort -unique"
sort -u file.txt