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

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

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

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

  • Blá, blá #Teste
  • 123123 #Realmente
  • Blá blá #Sério
  • klfdmngl #Teste

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

  • Blá, blá #Teste
  • klfdmngl #Teste
  • 123123 #Realmente
  • Blá blá #Sério

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

Responder1

Aqui está um arquivo de lote (.bat) ou de comando (.cmd) do Windows que fará isso. 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 criados e exclui os dois.

@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

Responder2

Aqui está uma solução final do PowerShell que lidará com novas linhas. O delimitador é considerado uma hashtag seguida por caracteres de palavra seguidos por {EOL}. Dada uma linha de dados sem hash tag, presume-se que os dados continuam na 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 o limite da nova linha. Este exemplo pressupõe que o arquivo se chama test.txt e está localizado 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

UsargVimno Windows ouMacVimno OS X.

OBSERVAÇÃO:Vim é um editor com 2 modos. Modo Inserir/Editar e modo Comando. Para realmente editar o texto como um editor normal, você deve estar no modo de edição, que requer o pressionamento de uma tecla como aou i. O editor iniciará no modo de comando. Quando estiver no modo de comando, você pode começar digitando dois pontos para inserir esses comandos.

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

O primeiro comando troca a hashtag do final da linha para o início 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.


@Oliver_Salzburg forneceu ummuito facilresponda com Excel nos comentários. Não pensei fora da caixa e respondi com um editor de texto.

Etapa 1: Substitua #pela ,#Etapa 2: Importe como CSV para Excel ou aplicativo semelhante. –Oliver Salzburgo♦


Aqui está uma solução usando apenas Powershell que pode ser feita nativamente no Win7. Ainda não tive a oportunidade de ler sobre como atravessar quebras de linha, então esta 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 subconchas.

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

Responder3

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

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

Não sou um especialista em PowerShell, então desculpe se existe 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 #
)}

informação relacionada