Win7에서 각 줄의 하위 문자열에 따라 문서를 정렬하려면 어떻게 해야 합니까?

Win7에서 각 줄의 하위 문자열에 따라 문서를 정렬하려면 어떻게 해야 합니까?

Windows-7에서 해시태그에 따라 텍스트를 정렬하려면 어떻게 해야 합니까?

다음과 같은 긴 텍스트(.txt 형식)가 있습니다.

  • 어쩌고저쩌고 #테스트
  • 123123 #정말
  • ㅋㅋㅋㅋㅋㅋ #정말
  • klfdmngl #테스트

나는 텍스트를 다음과 같이 편리하고 신속하며 자동으로 정렬하고 싶습니다.

  • 어쩌고저쩌고 #테스트
  • klfdmngl #테스트
  • 123123 #정말
  • ㅋㅋㅋㅋㅋㅋ #정말

매일 해야 하기 때문에 가능한 한 적은 단계로 수행할 수 있기를 바랍니다.

답변1

이를 수행하는 Windows 배치(.bat) 또는 명령(.cmd) 파일은 다음과 같습니다. 출력으로 무엇을 하려는지 확신할 수 없었기 때문에 생성된 두 개의 임시 파일 중 하나가 표시되고 둘 다 삭제됩니다.

@echo off
if {%1} == {} (
echo usage: %0 ^<filename^>
goto :EOF
)
echo.>_temp1
for /F "tokens=1,2 delims=#" %%i in (%1) do echo %%j$%%i>>_temp1
echo.>_temp2
sort _temp1 >_temp2
echo.>_temp1
for /F "tokens=1,2 delims=$" %%i in (_temp2) do @echo %%j#%%i>>_temp1
type _temp1
del _temp1
del _temp2

답변2

다음은 새로운 라인을 처리할 최종 Powershell 솔루션입니다. 구분 기호는 해시태그, 단어 문자, {EOL} 순으로 간주됩니다. 해시 태그가 없는 데이터 행이 주어지면 데이터가 다음 행으로 계속되는 것으로 가정됩니다. 내 답변의 이 섹션 아래에 있는 다른 정보는 데이터가 개행 경계를 넘는 저자가 언급한 특별한 경우를 다루지 않습니다. 이 예에서는 파일 이름이 test.txt이고 현재 디렉터리에 있다고 가정합니다.

[string[]]$fileContent = (get-content .\test.txt);
[string]$linebuffer = '';

[object]$fixedFile = foreach($line in $fileContent) {
    if(-not ($line -match "#\w+$")) {
        $linebuffer += ($line + ' ');
        continue;
    }

    $linebuffer += $line;
    $linebuffer;
    $linebuffer = '';
}

($fixedFile -replace '^(.*)\ (#.*)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii

사용gVimWindows에서 또는맥빔OS X에서.

메모:Vim은 2가지 모드를 갖춘 편집기입니다. 삽입/편집 모드와 명령 모드. 일반 편집기처럼 실제로 텍스트를 편집하려면 a또는 같은 키를 눌러야 하는 편집 모드에 있어야 합니다 i. 편집기가 명령 모드로 시작됩니다. 명령 모드에서는 콜론을 입력하여 이러한 명령을 입력하면 됩니다.

:%s/^\(.*\)\ \(\#\w\+\)$/\2\ \1/g
:sort
:%s/^\(\#\w\+\)\ \(.*\)$/\2\ \1/g

첫 번째 명령은 줄 끝의 해시태그를 줄의 시작 부분으로 바꿉니다. 두 번째 명령은 데이터를 정렬하고 세 번째 명령은 교환을 취소하고 해시태그를 다시 줄 끝으로 이동합니다.

귀하의 샘플에서 이것을 테스트했는데 작동합니다.


@Oliver_Salzburg가 제공한훨씬 쉽게댓글로 엑셀로 답해보세요. 나는 고정관념에서 벗어나 생각하지 않고 텍스트 편집기를 통해 답변을 제공했습니다.

1단계: 2단계: Excel 또는 유사한 응용 프로그램으로 CSV로 가져오기로 대체 #합니다 ,#. –올리버 잘츠부르크︎


다음은 Win7에서 기본적으로 수행할 수 있는 Powershell만 사용하는 솔루션입니다. 나는 아직 횡단 줄바꿈에 대해 읽을 기회가 없었기 때문에 이 솔루션은 이를 설명하지 않습니다.

이 예에서는 작업 중인 파일이 test.txt.

$tempstor = (get-content test.txt) -replace '^(.*)\ (#.*)$', '$2 $1' | Sort-Object
$tempstor -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ASCII

하나의 라이너로 하위 쉘을 활용합니다.

((get-content test.txt) -replace '^(.*)\ (#\w+)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii

답변3

Windows를 사용하는 경우 다음과 같은 간단한 PowerShell 스크립트를 사용할 수 있습니다.

[io.file]::ReadAllLines("test.txt")|Sort-Object {$_.SubString($_.IndexOf('#'))}

저는 PowerShell 전문가가 아니므로 더 최적의 솔루션이 있다면 죄송합니다. :)

내 입력 파일의 내용은 다음과 같습니다 test.txt.

PS C:\Users\Oliver> type test.txt
Blah blah #Test
123123 #Really
Oliver #SuperUser
Blah bluh #Really
klfdmngl #Test

위 스크립트를 실행할 때의 출력은 다음과 같습니다.

PS C:\Users\Oliver> [io.file]::ReadAllLines("test.txt")|Sort-Object {$_.SubString($_.IndexOf('#'))}
Blah bluh #Really
123123 #Really
Oliver #SuperUser
klfdmngl #Test
Blah blah #Test

분석

[io.file]       # From the module io.file...
::ReadAllLines  # use method ReadAllLines to read all text lines into an array...
("test.txt")    # from the file test.txt

|               # Take that array and pipe it to...
Sort-Object     # the cmdlet Sort-Object (to sort objects)
{               # To sort the elements in the array...
$_.SubString(   # use the part of the text line...
$_.IndexOf('#') # that starts at the first position of a #
)}

관련 정보