Win7 で各行のサブ文字列に従ってドキュメントを並べ替えるにはどうすればよいでしょうか?

Win7 で各行のサブ文字列に従ってドキュメントを並べ替えるにはどうすればよいでしょうか?

Windows 7 でハッシュタグに従ってテキストを並べ替えるにはどうすればよいでしょうか?

次のような長いテキスト (.txt 形式) があります。

  • 何とか何とか #テスト
  • 123123 #本当に
  • 何とか #本当に
  • klfdmngl #テスト

次のように、テキストを便利に、素早く、自動的に並べ替えられるようにしたいと思います。

  • 何とか何とか #テスト
  • klfdmngl #テスト
  • 123123 #本当に
  • 何とか #本当に

これを毎日行う必要があるので、できるだけ少ない手順で実行できるようにしたいと思います。

答え1

これを実行する Windows バッチ (.bat) またはコマンド (.cmd) ファイルはここにあります。出力で何をしたいのかわかりませんでしたが、これは作成される 2 つの一時ファイルのうちの 1 つを表示し、その後両方を削除します。

@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

使用gVimWindowsまたはマックビムOS X の場合。

注記:Vim は、挿入/編集モードとコマンド モードの 2 つのモードを持つエディターです。通常のエディターのように実際にテキストを編集するには、 または などのキーを押す必要がある編集モードにする必要がありますaiエディターはコマンド モードで起動します。コマンド モードでは、コロンを入力するだけでこれらのコマンドを入力できます。

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

最初のコマンドは、行末のハッシュタグを行頭にスワップします。2 番目のコマンドはデータをソートし、3 番目のコマンドはスワップを元に戻してハッシュタグを行末に戻します。

これをあなたのサンプルでテストしたところ、動作しました。


@Oliver_Salzburgが提供したはるかに簡単コメントに Excel で回答しました。私は既成概念にとらわれず、テキスト エディターで回答しました。

ステップ 1:#,#ステップ 2: CSV として Excel または同様のアプリケーションにインポートします。 –オリバー・ザルツブルク♦


ここでは、Win7 でネイティブに実行できる Powershell のみを使用したソリューションを示します。 まだ改行のトラバースについて調べる機会がないので、このソリューションでは改行は考慮されていません。

この例では、作業対象のファイルが であると想定しています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 #
)}

関連情報