Unix uniq에 해당하는 Windows가 있습니까?


17

텍스트 파일에서 중복 줄을 제거해야합니다 .Linux에서는 간단합니다.

cat file.txt |sort | uniq

file.txt에

aaa
bbb
aaa
ccc

출력됩니다

aaa
bbb
ccc

Windows와 동등한 제품이 있습니까? 또는 Windows 방식으로 어떻게합니까?


10
유닉스에서는 다음과 같이 쓸 수 있습니다.sort -u file.txt
jfs

1
이런 종류의 작업이 진행되는 한 WSL도 잘 작동합니다.
user2813274

더 이상 질문이 없다면 해결책으로 무언가를 설정하고 싶습니까?
davidbaumann

답변:


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 기본 제공 기능처럼 보입니다.
벤 Voigt

1
unsorted.txt 유형 | sort -unique> sorted.txt 이것은 실제로 win10에서 작동하며 새 파일에 고유 한 값을
썼습니다

7
@BenVoigt 놀랍게도, type file.txt | sort /unique작동 문서화되지 않은 스위치 /uniquesort.exe(윈도우 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/en-us/windows-server/administration/… 을 참조하십시오. 위의 답변은 일반적으로 알려지지 않은 tidbit를 공유하는 훌륭한 답변이었습니다. 왜 "/ unique"스위치가 유용한 지 문서화되지 않은 이유는 상상할 수 없습니다.
Debra

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
)

이것은 "cat mytextfile | uniq"뿐만 아니라 "uniq mytextfile"에서도 작동합니다. 모든 입력과 인수는 단순히 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
)

좋지만 결함이 있습니다. 그것은 현재 내용 등으로 실패 /?, ON, one ^ caret또는 bang!. 그러나 그것은 사용에 의해 해결 될 수있는 토글 지연 확장 기술을 하고 echo(다음을 참조 Dostips : ECHO를. 텍스트 또는 빈 줄을 표시하지
못함

고맙게도 토글 링 지연 확장 기술을 사용하는 이유는 분명하지도 않았고 분명하지도 않았습니다. 나는 지금 (거의) 완벽하도록 예제를 편집했다.
Tom Stein

0

Yu Jiaao의 답변에 추가. 다음 sort-object과 같은 명령 프롬프트에서 powershell cmdlet을 호출 할 수 있습니다 .

type file.txt | powershell -nop "$input | sort -unique"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.