純粋なWindowsCLIコマンドを使用して、3文字目ではなく3列目のデータでテキストファイルを並べ替えたいのですが。コマンドはバッチファイルに入れられます。
データは次のようになります
#filename seqno phasename a b c scale Rwp
blah_001.xye 1 corundum 3 3 12 0.001 3
blah_001.xye 1 silicon 5.4 5.4 5.4 0.002 3
blah_002.xye 2 corundum 3.1 3.1 12.1 0.002 3.5
blah_002.xye 2 silicon 5.41 5.41 5.41 0.004 3.5
blah_003.xye 3 corundum 3.2 3.2 12.2 0.001 3.1
blah_003.xye 3 silicon 5.42 5.42 5.42 0.002 3.1
blah_004.xye 4 corundum 3.4 3.4 12.2 0.001 3.2
blah_004.xye 4 silicon 5.43 5.43 5.43 0.002 3.2
blah_005.xye 5 corundum 3.5 3.5 12.3 0.001 3.9
blah_005.xye 5 silicon 5.44 5.44 5.44 0.002 3.9
blah_006.xye 6 corundum 3.6 3.6 12.3 0.001 3.1
blah_006.xye 6 silicon 5.45 5.45 5.45 0.002 3.1
フェーズ名でソートしたい。最初の行をそのままにしておけばよかったのに。 3番目以降は5列以上になり、これより多くの行がありますが、並べ替えは常に3列目で行われます。
この質問 を見てきましたが、forコマンドを解読できません。
ファイルは固定幅フォーマットを使用しているため、常に21位からソートを開始する必要があります。
SORT
コマンドは、行の特定の位置から開始して各行の比較を実行するオプションを提供します。唯一の欠点は、ヘッダーレコードを最上位に保持するメカニズムが提供されていないことです。
したがって、トリックはSET /P
を使用して最初の行を読み取り、それを新しいファイルに書き込むことです。次に、MORE +1
を使用して1行目を除くすべてを読み取り、それをSORT \+21
にパイプして、結果を新しいファイルに追加します。最後に行うことは、元のファイルをMOVE
の新しいファイルで上書きすることです。
@echo off
setlocal enableDelayedExpansion
set "file=test.txt"
set /p "ln=" < "%file%"
>"%file%.new" (
echo(!ln!
more +1 "%file%" | sort /+21
)
move /y "%file%.new" "%file%" >nul
この戦略には制限があります。
または、my JSORT.BATユーティリティ を使用して、1つの簡単なコマンドで簡単かつ効率的に並べ替えを実行できます。 MOVEは引き続き必要です。
@echo off
call test.txt /p 21 /s 1 /o test.txt.new
move /y test.txt.new test.txt >nul
JSORTは、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプト(ハイブリッドJScript /バッチ)です。サードパーティのexeファイルは必要ありません。
組み込みのSORTコマンドとは異なり、JSORTではデフォルトで大文字と小文字が区別される検索が使用されることに注意してください。サンプルテキストの問題ではありませんが、大文字と小文字を区別しない場合は、/I
オプションを追加するだけです。
JSORTには、ファイル全体がメモリ内の単一の文字列変数に収まる必要があるため、サイズ制限があります。正確な値はわかりませんが、サポートされている最大ファイルサイズは1GBより少し小さいと思います。
組み込みのヘルプを読んで、JSORTがサポートするその他の優れた機能について学習してください。