Как мне отсортировать документ по подстроке в каждой строке на Win7?
Как отсортировать текст по хэштегу в Windows-7?
У меня есть длинный текст (формат.txt), который выглядит примерно так:
- Бла-бла # Тест
- 123123 # Действительно
- Бла бла # действительно
- klfdmngl #Test
Я хотел бы удобно, быстро и автоматически иметь возможность сортировать текст так, чтобы он выглядел так:
- Бла-бла # Тест
- klfdmngl #Test
- 123123 # Действительно
- Бла бла # действительно
Я должен делать это ежедневно, поэтому я хотел бы иметь возможность сделать это в несколько шагов, насколько это возможно.
3 ответа
Вот окончательное решение 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
Используйте gVim в 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
Вот пакетный файл Windows (.bat) или командный (.cmd), который это сделает. Я не был уверен, что вы хотите сделать с выводом, так что он просто отображает один из двух временных файлов, которые он создает, а затем удаляет оба из них.
@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
Если вы работаете в 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 #
)}