web-dev-qa-db-ja.com

Windows CLI:テキストファイルを列で並べ替える

純粋な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コマンドを解読できません。

1
masher

ファイルは固定幅フォーマットを使用しているため、常に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

この戦略には制限があります。

  • ファイルが64k行を超えると、MOREがハングします
  • MOREはタブをスペースに変換します
  • SET/Pの制限により、ヘッダー行は1021文字を超えてはなりません。

または、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がサポートするその他の優れた機能について学習してください。

  • 埋め込まれた数値をテキストではなく数値として並べ替える
  • 固定位置ではなく、区切られたトークンに基づいて並べ替える
  • 一意の行のみを保持する
  • 出力行の数を制限する
2
dbenham