次1-4のような処理を自動処理させたいのですが

cygwin上のbashおよびperlやruby等を利用した方法そのものかその参考となるサイト・本を教えてください.★特に4の自動処理に関するコメントを希望します.
ちなみに当方DOSのバッチファイルなどは多少使用していますがshファイルの書き方なども良くわかっていません.
==
1.ヘッダーファイル(head_1991.txt)とデータ(deta1991_Jan.csv)を結合して保存(file1991_Jan)(DOSで言うところのcopy a+b c)
2.cygwin上のコマンド操作可能な特定のアプリケーションからファイル(file1991_Jan)を開き,操作後out.txtに出力.(2はアドバイス不要)
3.出力されたファイル(out.txt)のファイル名(file1991_Jan_out.txt)に変更
4.★この操作をファイル名の1991〜2005,およびJan〜Decをforでループさせる.

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/09/06 13:31:19
  • 終了:--

回答(5件)

id:actual No.1

actual回答回数610ベストアンサー獲得回数12005/09/06 14:32:45

ポイント16pt

bashですべて可能ですね。

ループはfor分

結合はcat

ファイル名変更はmv

です。

id:sterna

ありがとうございます.このURLは簡潔にまとまっていてよいですね

2005/09/06 23:45:48
id:dev_zer0 No.2

dev_zer0回答回数332ベストアンサー獲得回数252005/09/06 14:51:57

ポイント16pt

#!/bin/bash


# 4. 1991~2005,およびJan~Decをforでループさせる.のは面倒なので

# カレントディレクトリ配下にある全てのcsvに対して処理を行う

for f in $(ls *.csv)

do

  # 年、月の取得(detaYEAR_MON.csv)であることが前提条件

  year=$(expr substr $f 5 4)

  month=$(expr substr $f 10 3)


  # copy a+b cはbashではcat a b > c

  cat head_${year}.txt $f > file${year}_${month}


  # 2.のコマンド操作を行う


  # 3. ren a b はbashではmv a b

  mv out.txt file${year}_${month}_out.txt

done

id:sterna

ありがとうございます.具体的なコマンドまでいただけると,勉強になります.

2005/09/06 23:46:59
id:sasakipochi No.3

sasakipochi回答回数2ベストアンサー獲得回数02005/09/06 15:06:15

ポイント16pt

http://www.rhythm-cafe.com/shell/GrammerMenu.aspx

���{�I�ȕ��@ - [�V�F���X�N���v�g ���t�@�����X & Tips]

1.の回答です。


cat head_1991.txt deta1991_Jan.csv > file1991_Jan


もしくは


cp head_1991.txt file1991_Jan

cat deta1991_Jan.csv >> file1991_Jan


2 はアドバイス不要ということでしたが、もし、単語の置換や、整形等、自動処理ができるようであれば、自動処理等をするフィルタースクリプトを書くと便利です。

その場合は以下のように書くことができます。


cat file1991_Jan | (フィルタースクリプト) > out.txt


3. は以下のようにします。


mv out.txt file1991_Jan_out.txt


4.は、以下のようにします。


for y in 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 ; do ¥

for m in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do ¥

cat head_$y.txt deta$y_$m.csv > file$y_$m ; ¥

cat file1991_jan | (フィルタースクリプト) > out.txt ; ¥

mv out.txt file_$y_out.txt ; ¥

done ; ¥

done ;

id:sterna

こちらはループをした場合ですね.ありがとうございます.

2005/09/06 23:48:28
id:naka1kazu No.4

naka1kazu回答回数236ベストアンサー獲得回数122005/09/06 15:29:26

ポイント16pt

http://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO-9.html#ss...

BASH Programming - Introduction HOW-TO: �桼�����

id:sterna

綺麗なスクリプトありがとうございます.

2005/09/06 23:49:25
id:naka1kazu No.5

naka1kazu回答回数236ベストアンサー獲得回数122005/09/06 15:58:01

ポイント16pt

http://www.ruby-lang.org/ja/

オブジェクト指向スクリプト言語 Ruby

#!/usr/local/bin/ruby

for i in 1991 .. 2005 do

file1 = ”file_”+i.to_s+”.txt”

for j in [”Jan”,”Feb”,”Mar”,”Apr”,”May”,”Jun”,”Jul”,”Aug”,”Sep”,”Oct”,”Nov”,”Dec”] do

file2 = ”data”+i.to_s+”_”+j.to_s+”.csv”

file3 = ”file”+i.to_s+”_”+j.to_s

file4 = file3+”_out.txt”

system(”echo cat”+file1+” ”+file2+” > ”+file3)

system(”echo 2の処理”)

system(”echo mv out.txt ”+file4)

end

end

Ruby版です。4と同じですのでポイントは要りません。Bash版は$i_がうまくいきませんでしたがこちらの方がプログラミングはしやすいですね。どちらも力ずくなので、もう少しきれいにできるとは思います。

id:sterna

なるほどRubyからでもsystem()とすれば簡単にbashを操れるのですね.ありがとうございます.

2005/09/06 23:51:16

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません