web-dev-qa-db-ja.com

Unixのuniqと同等のWindowsはありますか?

テキストファイルから重複する行を削除する必要があります。Linuxでは次のように簡単です。

cat file.txt |sort | uniq

file.txtに含まれる場合

aaa
bbb
aaa
ccc

出力します

aaa
bbb
ccc

同等のWindowsはありますか?またはどのようにこれはWindowsの方法で?

15
Yu Jiaao

PowerShellのSort-Objectコマンドレットは、uniqと同じことを行う-Uniqueスイッチをサポートします。

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

もちろん、PowerShellにエイリアスが存在するため、次のように書くこともできます。

type file.txt | sort -unique

さらに、Windows 10の/uniqueには文書化されていないsort.exeスイッチがあるので、これはコマンドプロンプトで動作するはずです。

type file.txt | sort /unique
26
Yu Jiaao

Gnu/coreutilsバージョンと同じように動作するuniqのportsがあります。私は個人的に GOW のバリエーションを使用していますが、Windows用gitにはかなり 新しいバージョンがあります 。 cygwinは必要ありませんが、後者の場合は/ usr/binを調べる必要があります。

これらのパッケージにはcat、sort、uniqも含まれているので - あなたのワークフローはほとんど同じであるべきで、そしてcat file.txt |sort | uniqはほとんど同じように働くべきです

6
Journeyman Geek

あなたは自分で簡単に "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
)

これは、 "cat mytextfile | uniq"と同様に "uniq mytextfile"でも動作します。すべての入力と引数は単にsortコマンドに渡されるためです。

Windows 7から、あなたは本当に大文字と小文字を区別するバージョンが欲しいかもしれません(違いは文書化されていないスイッチ "sort/C"とno "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
)
1
Tom Stein