Windows 上是否有与 Unix uniq 等效的程序?

Windows 上是否有与 Unix uniq 等效的程序?

我需要从文本文件中删除重复的行,在 Linux 中很简单,使用

cat file.txt |sort | uniq

当 file.txt 包含

aaa
bbb
aaa
ccc

它将输出

aaa
bbb
ccc

有 Windows 等效程序吗?或者如何以 Windows 方式执行此操作?

答案1

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

答案2

uniq 的某些移植版本与 gnu/coreutils 版本的工作方式完全相同。我个人使用的是九州但 git for windows 有一个显著的较新版本。虽然后者不需要 cygwin,但您需要查看 /usr/bin

由于这些包还包含 cat、sort 和 uniq - 您的工作流程应该基本相同,并且cat file.txt |sort | uniq工作方式也应该基本相同

答案3

您可以轻松地自己编写命令“uniq”。将其保存在批处理文件“uniq.cmd”中,该文件位于 %path% 中可以找到的某个位置(例如 %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”;因为所有输入和参数都简单地传递给排序命令。

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

答案4

除了余嘉敖的回答。您可以调用sort-object命令提示符中的 powershell cmdlet 例如:

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

相关内容