¿Cómo puedo ordenar un documento según una subcadena en cada línea en Win7?

¿Cómo puedo ordenar un documento según una subcadena en cada línea en Win7?

¿Cómo puedo ordenar un texto según el hashtag en Windows-7?

Tengo un texto largo (formato .txt) que se parece a esto:

  • Bla, bla #Prueba
  • 123123 #De Verdad
  • Bla, azul #De verdad
  • klfdmngl #Prueba

Me gustaría poder ordenar el texto de manera conveniente, rápida y automática para que se vea así:

  • Bla, bla #Prueba
  • klfdmngl #Prueba
  • 123123 #De Verdad
  • Bla, azul #De verdad

Tengo que hacer esto a diario, así que me gustaría poder hacerlo en la menor cantidad de pasos posible.

Respuesta1

Aquí hay un archivo por lotes (.bat) o de comando (.cmd) de Windows que lo hará. No estaba seguro de qué quería hacer con el resultado, por lo que esto solo muestra uno de los dos archivos temporales que crea y luego los elimina.

@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

Respuesta2

Aquí hay una solución final de PowerShell que se ocupará de las nuevas líneas. Se supone que el delimitador es un hashtag seguido de caracteres de palabra seguidos de {EOL}. Dada una línea de datos sin etiqueta hash, se supone que los datos continúan en la siguiente línea. La otra información debajo de esta sección de mi respuesta no trata el caso especial mencionado por el autor donde los datos cruzan un límite de nueva línea. Este ejemplo supone que el archivo se llama test.txt y se encuentra en el directorio actual.

[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

UsargVimen Windows omacvimen OS X.

NOTA:Vim es un editor con 2 modos. Modo Insertar/Editar y modo Comando. Para editar texto como un editor normal, debes estar en modo de edición, lo que requiere presionar una tecla como ao i. El editor se iniciará en modo comando. Cuando esté en modo comando, puede comenzar escribiendo dos puntos para ingresar estos comandos.

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

El primer comando intercambia el hashtag al final de la línea con el principio de la línea. El segundo comando ordena los datos y el tercer comando deshace el intercambio y mueve el hashtag al final de la línea.

Probé esto en su muestra y funciona.


@Oliver_Salzburg proporcionó unmás fácilresponder con Excel en comentarios. No pensé fuera de lo común y proporcioné una respuesta con un editor de texto.

Paso 1: Reemplazar #con ,#Paso 2: Importar como CSV a Excel o aplicación similar. –Oliver Salzburgo♦


Aquí hay una solución que utiliza solo Powershell y que se puede realizar de forma nativa en Win7. Todavía no he tenido la oportunidad de leer sobre cómo atravesar saltos de línea, por lo que esta solución no los tiene en cuenta.

Este ejemplo supone que el archivo con el que estás trabajando es test.txt.

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

Una línea, aprovecha las subcapas.

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

Respuesta3

Si estás en Windows, puedes usar este sencillo script de PowerShell:

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

No soy un experto en PowerShell, así que lo siento si hay una solución más óptima :)

Ejemplo

Aquí está el contenido de mi archivo de entrada test.txt:

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

Este es el resultado al ejecutar el script anterior:

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álisis

[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 #
)}

información relacionada