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

他に質問がない場合は、何かを解決策として設定したいでしょうか?
davidbaumann

回答:


31

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

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

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

type file.txt | sort -unique

さらに、Windows 10 /uniquesort.exeは文書化されていないスイッチがあるため、これはコマンドプロンプトで機能するはずです。

type file.txt | sort /unique

1
Windowsコマンド(sort.exe)はこれをサポートしていないと思います。PowerShellビルトインの機能のように見えます。
Ben Voigt 2018

1
タイプunsorted.txt | sort -unique> Sorted.txtこれは本当にwin10で動作し、新しいファイルに一意の値を
書き込みました

7
@BenVoigtは驚くべきことに、文書化されていないユーティリティの切り替えでtype file.txt | sort /unique動作します(少なくともWindows 10では)。反対に、提供されている例は実際にはPowerShell です。/uniquesort.exeGet-Content file.txt | Sort-Object -unique
JosefZ

1
sort /uniqueInvalid switch.Windows 7 Enterpriseでのエラー。
Don Cruickshank

1
@JosefZの場合、答えはダッシュではなく "/"(スラッシュ)を使用してスイッチを指定します。スラッシュはCMDのコマンドのWindows標準であり、すべてのコマンドでコマンドスイッチのスラッシュの代わりにダッシュを使用できるわけではありません。docs.microsoft.com/en-us/windows-server/administration/…クイックリファレンスとして一貫してスラッシュが表示されます。上記は素晴らしい答えでした。一般的に知られていない一口を共有していますが、「/一意」スイッチが非常に便利であるため、文書化されていない理由は想像できません。
デブラ、

6

gnu / coreutilsバージョンと同じように機能するuniqのポートがあります。私は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 ^ caretまたはbang!。しかし、それはトグルする遅延拡張技術を使用することで解決でき、echo(以下を参照してください:Dostips:ECHO。テキストまたは空白行を表示できない
jeb

おかげで、切り替えの遅れた拡張テクニックを使用する理由は明らかでもなく、マークもされていませんでした。私は自分の例を(ほぼ)完璧になるように編集しました。
トムスタイン

0

Yu Jiaaoの回答への追加。sort-object次のようなコマンドプロンプトでpowershellコマンドレットを呼び出すことができます。

type file.txt | powershell -nop "$input | sort -unique"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.