Как отсортировать документ по подстроке в каждой строке на Win7?

Как отсортировать документ по подстроке в каждой строке на Win7?

Как отсортировать текст по хэштегу в Windows 7?

У меня есть длинный текст (формат .txt), который выглядит примерно так:

  • Бла-бла #Тест
  • 123123 #Действительно
  • Бла-бла #Действительно
  • klfdmngl #Тест

Мне бы хотелось удобно, быстро и автоматически сортировать текст так, чтобы он выглядел следующим образом:

  • Бла-бла #Тест
  • klfdmngl #Тест
  • 123123 #Действительно
  • Бла-бла #Действительно

Мне приходится делать это ежедневно, поэтому я хотел бы сделать это за как можно меньшее количество шагов.

решение1

Вот пакетный (.bat) или командный (.cmd) файл Windows, который это сделает. Я не был уверен, что вы хотели сделать с выводом, поэтому он просто отображает один из двух временных файлов, которые он создает, а затем удаляет их оба.

@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

ИспользоватьгВимв Windows илиMacVimна OS X.

ПРИМЕЧАНИЕ:Vim — это редактор с 2 режимами. Режим вставки/редактирования и командный режим. Чтобы редактировать текст как в обычном редакторе, вы должны находиться в режиме редактирования, для чего требуется нажать клавишу типа aили i. Редактор запустится в командном режиме. В командном режиме вы можете просто начать, набрав двоеточие, чтобы ввести эти команды.

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

Первая команда меняет хэштег в конце строки на начало строки. Вторая команда сортирует данные, а третья команда отменяет замену и перемещает хэштег обратно в конец строки.

Я проверил это на вашем образце, и это работает.


@Oliver_Salzburg предоставилнамного легчеответ в Excel в комментариях. Я не стал выходить за рамки и предоставил ответ в текстовом редакторе.

Шаг 1: Заменить #на ,#Шаг 2: Импортировать как CSV в Excel или аналогичное приложение. –Оливер Зальцбург♦


Вот решение, использующее только Powershell, которое можно реализовать на Win7. У меня до сих пор не было возможности почитать о переходе через разрывы строк, поэтому это решение их не учитывает.

В этом примере предполагается, что вы работаете с файлом 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 #
)}

Связанный контент