WindowsXPのコマンドプロンプト(バッチ)でテキストファイル(改行あり)から100行間隔でデータを抽出する方法を教えてください。
300行ある場合、1行目、101行目、201行目を抽出したいです。宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

@echo off


set N=0
for /f "delims=" %%A in (input.txt) do (
call :CHK
if ERRORLEVEL 1 echo %%A
)
goto :EOF
:CHK
set /a N+=1 , X=N %% 100
if %X%==1 exit /b 1
exit /b 0
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。ご説明不足もあったかと思うのですが、イメージにとても近い回答をいただきました。
以下に出来上がったものを添付いたします。他の方のお役にも立てばと思います。

@echo off
::<コメント開始>
:: 「テキストファイルからサンプリングファイルを抽出するバッチプログラム」
:: 1.目的
::   テキストファイル(SJISコードで改行ありのみ対応)のうちサンプリングで
:: ***行に1行を抽出する。
::   100行単位に指定した場合、1行目(ヘッダー行)、101行目、201行目、・・・・・
:: 2.使い方と説明
::  @echo off
::  →画面表示しない
::  del output.txt
::  →アウトプットファイルを作業前に削除
::  set N=0
::  for /f "tokens=1 delims=" %%A in (input.txt) do (
::  →tokens=1は1行を1つの塊として扱うの意味
::   delims=は区切り文字なしの意味
::   input.txtはインプットファイル
::   ネットワーク経由の場合例:\\172.16.***.***\data\input.txtなど
:: (事前にクライアントから相手の該当フォルダにアクセスできている必要がある)
::  call :CHK
::  →サブルーチンをコール(:CHKに飛ぶ)
::  if ERRORLEVEL 1 echo %%A>>output.txt
::  →サブルーチンからの戻り値が1だったらoutput.txtに書き込む
::  )
::  goto :EOF
::  →ファイルを読み終えたらEOFに行く
::
::  以下はサブルーチン
::  :CHK
::  set /a N+=1 , X=N %% 100
::  →Nに1を足し、100で割った余りをXにセットする
::  if %X%==1 exit /b 1
::  exit /b 0
::  →exitで「/b」が指定されている場合、ERRORLEVEL にその数値を設定し、
:: for文に戻る。
::<コメント終了>

del output.txt
set N=0
for /f "tokens=1 delims=" %%A in (\\172.16.***.***\data\input.txt) do (
call :CHK
if ERRORLEVEL 1 echo %%A>>output.txt
)
goto :EOF
:CHK
set /a N+=1 , X=N %% 100
if %X%==1 exit /b 1
exit /b 0

お礼日時:2011/04/28 13:09

すみません最初の1行目がなかったですね



for /f "usebackq tokens=1,* delims=:" %a in (`findstr /n /r "^" a.txt ^| findstr /r "^1: ^[0-9]*[0-9]01:"`) do @echo a=[%a] b=[%b]
    • good
    • 0
この回答へのお礼

追記ありがとうございます。

お礼日時:2011/04/28 13:05

もうちょっと汎用性あり、



デバック用
for /f "usebackq tokens=1,* delims=:" %a in (`findstr /n /r "^" a.txt ^| findstr /r "^[0-9]*[0-9]01:"`) do @echo a=[%a] b=[%b]

該当行出力
for /f "usebackq tokens=1,* delims=:" %a in (`findstr /n /r "^" a.txt ^| findstr /r "^[0-9]*[0-9]01:"`) do @echo %b

バッチファイル用
for /f "usebackq tokens=1,* delims=:" %%a in (`findstr /n /r "^" a.txt ^| findstr /r "^[0-9]*[0-9]01:"`) do @echo %%b

と言うことで、a.txtを対象となるファイル名にしてください
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。いろいろなやり方があるものですね!

お礼日時:2011/04/28 13:04

For /F "usebackq delims=: tokens=1,*" %i In ( `Findstr /N ".*" hoge.txt^|Findstr "^1: ^101: ^201:"` ) Do Echo %j



hoge.txtが抽出するファイル名。
バッチにするなら%%iと%%jに。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。いろんな方法があるものですね!

お礼日時:2011/04/28 13:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qバッチファイルで環境変数が設定されません

よろしくお願いいたします。
Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。
command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。

cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。

なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。
アドバイスをよろしくお願いいたします。

@echo off
set foo=word
path=c:\
echo %foo%
echo %path%
上記バッチを実行すると
word
c:\
と表示されますが、set コマンドで確認すると
FOO は存在しません
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;...
と表示されます。 これはバッチ実行前の値です。

よろしくお願いいたします。
Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。
command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。

cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。

なぜ command.com 上のバッチから操作できな...続きを読む

Aベストアンサー

#2です。

> >>あらかじめ起動しておいたcommand.comのプロンプトでバッチファイルを実行すれば期待通りになっているように思えるのですが。
> 私もその様に考えて同様の期待をしてバッチファイルを実行しました。
> しかしバッチ終了後に set コマンドで確認すると、環境変数はまったく変化していないのです。 バッチ実行前の状態なのです。

不思議ですね。
こちらではバッチファイルで変更した環境変数はプロンプトに戻っても変化したままです。
XP Pro SP2なので環境は変わらないと思いますが。

#COMSPEC環境変数でcmd.exeを指定してるとか。

Qコマンドプロンプトのコマンドを使ってバッチファイルを作ってみたいのですが

プログラミングについてはコマンドプロンプトでバッチファイル(ログファイルの作成など)を何度か作成したことのあるだけの初心者なのですが、
バッチファイルは簡単で幅広い実用性があるように感じています。
 コマンドプロンプトを使ったバッチファイルでどのようなことができるのか実用例が載っている本を探しています。
 これは役に立つ!という本がありましたら是非教えていただけませんか?

Aベストアンサー

バッチファイルの解説本は10年くらい前は結構ありましたが、ここ数年はほとんど出版されていません。
多くが絶版になっていると思います。

バッチファイルで済む内容ならバッチファイルでやったほうが簡単なので今でも使うことはあります。
覚えても損はありませんが、変数の使い方,IF,FORあたりの肝となる部分を覚えればバッチファイルの守備範囲としては十分かと。
わざわざ本を探して買わなくとも、ネットで調べる程度でいいと思います。

ちょっと凝った内容になると役不足になるので、これから覚えるのならVBScriptがExcelやWordでも応用できてオススメです。

QMS-DOSのバッチで変数を使いたい

バッチで、変数というものを使えますか?
以下のようなものをイメージしていますが、これに近いソースを教えてもらえないでしょうか?

@ECHO OFF
i=2008
echo "現在は" + i + "年です"

Aベストアンサー

@ECHO OFF
set i=2008
echo 現在は %i% 年です

Qコマンドプロンプトのバッチファイル

バッチファイル内でInternetExplorer(以下IE)を
3つ起動させようとしています。

ただ単に

"[IEのパス]\iexplorer.exe"

と3行書いただけだと、ますIEがひとつ開いて、とまってしまい
開いたIEを閉じるとまたIEが開き、それを閉じたらまたIEが開く。

と言うように、閉じないとバッチファイルが先に進んでくれません。

ウィンドウを閉じなくても先に進んでくれる方法は
ありますでしょうか?

おわかかりになる方、ご助言願います。

Aベストアンサー

startコマンドを使うと実現できます。
この場合、IEXPLORE.EXE にフルパスは不要です。

start IEXPLORE.EXE
start IEXPLORE.EXE
start IEXPLORE.EXE

Qバッチファイルで変数の内容変更

以下のバッチファイルで,10回目のループで,ファイル名を入力している変数を
「out.txt」と変更したいのですが,変更前の「in.txt」と
出力されてしまいます。
どのように対処すれば宜しいでしょうか?
よろしくお願いします。

@echo off
set FLN=in.txt
for /L %%N in ( 1 , 1 , 10 ) do (
echo %%N
if "%%N" equ "10" (
echo 変更します
set FLN=
set FLN=out.txt
)
echo %FLN%
)
@echo on

Aベストアンサー

「cmd /V:ON」でコマンドウィンドを開き、以下のように修正すれば、意図した動作となると思います。
詳細は、「help set」をご参照ください。

@echo off
set FLN=in.txt
for /L %%N in ( 1 , 1 , 10 ) do (
echo %%N
if "%%N" equ "10" (
echo 変更します
set FLN=
set FLN=out.txt
)
echo !FLN! <---------------------
)
@echo on

Qバッチファイル コマンドプロンプトのウインドウを閉じるには?

VWD2008のASP.NET開発サーバを起動させるバッチファイルを作成してみたのですが、起動はできたもののコマンドプロンプトのウインドウを閉じることができません。
使用勝手を考えると、バッチをクリック→開発サーバ起動→プロンプトのウインドウを自動で消す、ところまで一括で処理させたいと考えていますが、可能でしょうか?
バッチファイルの中身は以下のようになっています。

cd /d c:\Program Files\Common Files\Microsoft Shared\DevServer\9.0
WebDev.WebServer /port:8080 /path:"C:\Documents and Settings\you\My Documents\system\kanri\kanri" /vpath:"/"
EXIT

Aベストアンサー

現在VS2008開発環境がないので、コマンドの内容については全く理解していないため、誤りがあるかもしれませんが、

WebDev.WebServer /port:8080 /path:"C:\Documents and Settings\you\My Documents\system\kanri\kanri" /vpath:"/"

の前にstartを付けて

start WebDev.WebServer /port:8080 /path:"C:\Documents and Settings\you\My Documents\system\kanri\kanri" /vpath:"/"

としてみるとどうでしょうか(EXITも不要だと思います)


※Windows XP Professionalなら、開発サーバーを起動しなくてもIISを構築しIIS上のサイトとして動かすこともできるはずです。

Qコマンドプロンプト バッチ|結果を変数に代入する方法

バッチで、外部のEXEを実行した結果を変数に代入する方法を教えてください。

外部のEXEは
hogehoge.exe あいうえお
と実施した場合
おえういあ
という結果を返します。

たとえば…

SET HOGE=hogehoge.exe あいうえお
ECHO %HOGE%

の結果として おえういあ を表示する
という風にしたいです。

Aベストアンサー

Win2000やXPなど NT系のコマンドプロンプトなら
usebackqを使って バッチの変数に代入してやればいいと思いますよ

for /F "usebackq" %%s in (`hogehoge.exe あいうえお`) DO@ SET HOGE=%%s
といった具合で in句の『hogehoge.exe あいうえお』の実行結果が バッチ変数 %%sに代入されます

Qコマンドプロンプトのバッチファイルについて

ディレクトリ1に以下のようなファイルがあります。
 "file01_05_aa.jpg"
 "file01_05_bb.jpg"
 "file01_05_cc.jpg"
 "file21_04_aa.jpg"
 "file21_04_bb.jpg"
 "file21_04_cc.jpg"
 "file31_03_aa.jpg"
 "file31_03_bb.jpg"
 "file31_03_cc.jpg"
これらのファイル形式は
(file)(XX)_(XX)_(XX).jpg

これらの中からこの正規表現でヒットするファイルのみ指定した別ディレクトリにコピーしたいです。
file\d\d_(05|03)_(aa|cc)\.jpg

Windowsのコマンドプロンプトで実現可能でしょうか。可能であればコマンド列を教えてください。
(cygwinでも良いです。)

よろしくお願いいたします。

Aベストアンサー

cygwinを使ってもいいのであれば
$ cp `ls --color=no | egrep -e '正規表現'` コピー先
で行けると思われます。
シングルクォート(')とバッククォート(`)の違いに注意。

Qバッチファイルへの変数のキー入力、変数名を含むファイルへの出力

とあるヘッダーの作成のため、キー入力した値で、変数名を含む名前のテキストに変数の入ったファイルを書き出そうと思うのですが、どなたかアドバイスいただけますでしょうか。

いまのところ次のような感じで、%num%という変数に数字を入れるようにしたいのですが。
SET/P %num% = 数字を入力してください: 
echo right: %num% >> header%num%.txt
echo leftt: %num% >> header%num%.txt

また、バッチファイルのサンプルが多く載っている書籍等の紹介でもかまいませんどうぞよろしくお願いします。

Aベストアンサー

アドバイスというか・・・

> SET/P %num% = 数字を入力してください: 
これ変では?

> SET/P num= 数字を入力してください: 
なのでは?
#代入時に「%~%」は不要。変数名の後の=との間に空白不要。

Qご教授ください。(Windows バッチコマンド)

よろしくお願いします。
ここのところ質問ばかり申し訳ありません。
自分の頭の悪さに泣いております・・・。

以下のバッチファイル(Windows2000)を
作成できればと検討中です。
もし宜しければご教授願えますでしょうか。
さっぱり分かりません。

Q1.
あるアプリケーションが出力するログがあります。
このログを2世代管理したいと考えています。
1日目に出力されたログを abc.log とすると、
2日目のアプリケーションの起動時にこの「abc.log」
を「abc.日付」にコピーし、「abc.log」の内容を
クリアし、2日目のアプリケーションのログを
書き出せるようにする。
3日目のアプリケーションの起動時に「abc.log」を
「abc.日付」にコピーし、「abc.log」の内容の
クリアと2日目に作成した「abc.日付」(内容は1日目
のログ)を削除する。

Q2.
この曜日ならこの処理をする。
というように、曜日で処理を分岐させる。

どうぞ宜しくお願い致します。

Aベストアンサー

個人的には、WSHを使った方が書きやすいと思いますが、バッチの小ネタをいくつか。

1)日付文字列の作成:

SET TODAY=%DATE:~-10,-6%%DATE:~-5,-3%%DATE:~-2%
ECHO %TODAY%

%DATE%の出力はロケールに依存するので、調整が必要かも。

2)日付の最も旧いファイル名の取得:

FOR /F "usebackq" %%f IN (`dir /b/o:-d a.log.*`) DO SET OLDLOG=%%f
ECHO %OLDLOG%

3)ファイルの内容を空にする:

COPY /y NUL a.log

4) 曜日の取得

……はあまり良い手が思いつかない。%DATE%に含まれていれば簡単ですが。

cygwinのlogrotateとか使った方が手っ取り早いかも。


人気Q&Aランキング

おすすめ情報