是否有与Unix uniq等效的Windows?


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 '18

如果您没有其他问题,也许您想设置一些解决方案?
davidbaumann '18年

Answers:


31

Sort-ObjectPowerShell中的cmdlet支持-Unique与以下功能相同的开关uniq

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

当然,由于PowerShell中存在别名,您还可以编写:

type file.txt | sort -unique

此外,Windows 10中没有未记录的/unique开关sort.exe,因此,这应该在命令提示符下起作用:

type file.txt | sort /unique

1
我不认为Windows命令(sort.exe)支持此功能;它看起来像PowerShell内置功能。
Ben Voigt

1
输入unsorted.txt | sort -unique> sorted.txt这在win10下确实有效,并将唯一值写入新文件
Lixas

7
令人惊讶的是,@ BenVoigt type file.txt | sort /unique可以与未记录/uniquesort.exe实用程序开关一起使用(至少在Windows 10上如此)。另一方面Get-Content file.txt | Sort-Object -unique,实际上所提供的示例是PowerShell 。
JosefZ

1
sort /uniqueInvalid switch.Windows 7 Enterprise上的错误。
Don Cruickshank

1
@JosefZ,答案使用“ /”(正斜杠)而不是破折号指定开关。正斜杠是CMD中命令的Windows标准,并且并非所有命令都允许在命令开关上用破折号代替斜杠。docs.microsoft.com/zh-cn/windows-server/administration/…作为快速参考,始终显示斜线。上面是一个很好的答案,分享了一个鲜为人知的窍门,尽管我无法想象为什么“ / unique”开关没有记载,因为它是如此有用。
黛布拉

6

uniq的端口与gnu / coreutils版本的功能相同。我个人使用GOW的变体,但用于Windows的git具有明显较新的版本。不需要cygwin,但是对于后者,您需要查看/ usr / bin

由于这些软件包还包含cat,sort和uniq-您的工作流程应大致相同,并且cat file.txt |sort | uniq应大致相同


2

您可以轻松地自己编写命令“ uniq”。将其保存在%path%可以找到的批处理文件“ 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开始,您可能需要一个区分大小写的版本(区别在于未记录的开关“ 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
)

不错,但是有一些缺陷。目前,它失败与内容一样/?ONone ^ caretbang!。但这可以通过使用切换延迟扩展技术来解决,echo(请参阅:Dostips:ECHO。无法输入文本或空白行
jeb

谢谢,使用切换延迟扩展技术的原因并不明显,也没有明显的原因。我编辑了示例,使其(几乎)完美。
汤姆·斯坦因

0

除了于家ao的答案。您可以sort-object在命令提示符下调用powershell cmdlet,例如:

type file.txt | powershell -nop "$input | sort -unique"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.