Win7下如何根據每行的子字串對文件進行排序?

Win7下如何根據每行的子字串對文件進行排序?

如何在 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 或麥克維姆在 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 #
)}

相關內容