Como posso classificar um documento de acordo com uma substring em cada linha no Win7?

0

Como posso classificar um texto de acordo com a hashtag no Windows-7?

Eu tenho um texto longo (formato .txt) que se parece com algo assim:

  • Blá blá #Teste
  • 123123 #Realmente
  • Blah bluh #Realmente
  • klfdmngl #Teste

Gostaria de classificar de forma conveniente, rápida e automática o texto para que fique assim:

  • Blá blá #Teste
  • klfdmngl #Teste
  • 123123 #Realmente
  • Blah bluh #Realmente

Eu tenho que fazer isso diariamente, então eu gostaria de poder fazer isso no menor número de etapas possível.

    
por Joey Hammer 21.09.2012 / 13:58

3 respostas

1

Aqui está um arquivo de lote (.bat) ou de comando (.cmd) do Windows que o fará. Eu não tinha certeza do que você queria fazer com a saída, então isso apenas exibe um dos dois arquivos temporários que ele cria e, em seguida, exclui ambos.

@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
    
por 21.09.2012 / 17:33
1

Aqui está uma solução final de PowerShell que lidará com novas linhas. O delimitador é assumido como sendo uma hashtag seguida por caracteres de palavra seguido por {EOL}. Dada uma linha de dados sem hash tag, supõe-se que os dados continuem para a próxima linha. As outras informações abaixo desta seção da minha resposta não tratam do caso especial mencionado pelo autor onde os dados cruzam um limite de nova linha. Este exemplo assume que o arquivo é chamado test.txt e é encontrado no diretório atual.

[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

Use gVim no Windows ou MacVim no Mac OS X.

NOTA: Vim é um editor com 2 modos. Inserir / Editar modo e modo de comando. Para realmente editar o texto como um editor normal, você deve estar no modo de edição, o que requer pressionar uma tecla como a ou i . O editor irá iniciar no modo de comando. Quando no modo de comando, você pode começar digitando dois pontos para inserir esses comandos.

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

O primeiro comando troca a hashtag no final da linha até o começo da linha. O segundo comando classifica os dados e o terceiro comando desfaz a troca e move a hashtag de volta para o final da linha.

Eu testei isso em sua amostra e funciona.

O @Oliver_Salzburg forneceu uma resposta muito mais fácil com o Excel nos comentários. Eu não pensei fora da caixa e dei uma resposta com um editor de texto.

Step 1: Replace # with ,# Step 2: Import as CSV into Excel or similar application. – Oliver Salzburg♦

Aqui está uma solução usando apenas o Powershell que pode ser feito originalmente no Win7. Eu ainda não tive a chance de ler as quebras de linha, então essa solução não leva em conta isso.

Este exemplo pressupõe que o arquivo com o qual você está trabalhando é test.txt .

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

Um forro, aproveite sub-shells.

((get-content test.txt) -replace '^(.*)\ (#\w+)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii
    
por 21.09.2012 / 14:06
0

Se você estiver no Windows, poderá usar este script simples do PowerShell:

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

Eu dificilmente sou um especialista em PowerShell, então, desculpe se houver uma solução mais ideal:)

Exemplo

Aqui está o conteúdo do meu arquivo de entrada test.txt :

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

Esta é a saída ao executar o script acima:

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

Análise

[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 #
)}
    
por 21.09.2012 / 20:14