0

次のような単純なファイルがあります。

Submit.log

Submitting job(s)..
2 job(s) submitted to cluster 528.
Submitting job(s)..
2 job(s) submitted to cluster 529.

次に、2行目(クラスター)の最後の数値のみを出力する必要があります。この場合、目的の出力は次のようになります。

528
529

以下のスクリプトを使用してみましたが、なぜ機能しないのかわかりません。バッチを使用して行う必要があります。これはシステムの制限です。

@ECHO OFF
FOR /F "tokens=6" %%g IN (Submit.log) DO (
set Job=%%g
echo %Job:.=%
)

エレガントな解決策は間違いなくプラスですが、誰かが簡単な解決策で私を助けてくれるなら、私は感謝します。

4

2 に答える 2

1

これが機能するワンライナーです。FINDSTR検索は、検索を非常に正確にするために簡単に適合させることができます。

@echo off
for /f "tokens=6 delims=. " %%N in ('findstr /c:"submitted to cluster" "submit.log"') do echo %%N

paxdiabloソリューションも簡略化できるため、値を変更する必要がないため、拡張を遅らせる必要がありません。使用したいトークンだけで、すべてのトークンをキャプチャする必要はありません。区切り文字は、ドットとスペースを検索するように設定されています(デフォルトはスペースとタブでした)。paxdiabloが言ったように、検索をより正確にするために、より多くのトークンをテストできますが、これはFINDSTRほど便利ではありません。

@echo off
for /f "tokens=5,6 delims=. " %%A in (submit.log) do if %%A==cluster echo %%B
于 2012-04-05T11:20:55.133 に答える
1

次のスクリプトがその役割を果たします。

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=1-6" %%a IN (submit.log) do (
    if %%c==submitted (
        set job=%%f
        echo !job:.=!
    )
)
endlocal

そして、私は基本的に控えめなタイプなので、それがエレガントシンプルであると主張することはやめます:-)

基本的には、3番目の単語が含まれている行のみを調べsubmitted(問題があることが判明した場合は追加のルールを使用することもできます)、6番目の単語を変更して出力します。

遅延展開の使用に注意してください(!代わりにを使用%)。これは、ループが開始する前に変数が評価されないようにするために必要です。

于 2012-04-05T03:17:44.213 に答える