如何在 Windows-7 上根据标签对文本进行排序?
我有一个长文本(.txt 格式),看起来像这样:
- 啦啦啦#测试
- 123123 #真的
- 哇喔#真的
- klfdmngl #测试
我希望能够方便、快速、自动地对文本进行排序,使其看起来像这样:
- 啦啦啦#测试
- klfdmngl #测试
- 123123 #真的
- 哇喔#真的
我每天都必须这样做,所以我希望能够以尽可能少的步骤来完成它。
答案1
这是一个可以执行此操作的 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
答案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 是一种具有两种模式的编辑器。插入/编辑模式和命令模式。要像普通编辑器一样编辑文本,您必须处于编辑模式,这需要按下 或 等键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 #
)}