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