- 締切済み
awkによる多数のファイルへのアクセス
ディレクトリに次のようなファイル名のファイルが多数あったとします。 (共通部分;英数字のみ)_(日付;20060409) awkで、これらのファイルの全てにアクセスしてデータを取得、 処理を行わせたいのですが、どのようにすればよいでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mac_res
- ベストアンサー率36% (568/1571)
>/tmp/fooにabc_1、abc_2、scriptファイルをおいて >試しにやってみましたところ、 >./test.script: line 6: /tmp/foo: Is a directory >mv: cannot overwrite non-directory `abc_1' with >directory `/tmp/foo' >というエラーメッセージになってしまいます。 このshell scriptは/tmp/fooを作業用のファイルとして使います。ですので、/tmp/fooというdirがあると正常に動作しません。ファイルは/tmp/foo以外のdirにおいて/tmp/fooが無い状態で動作させてください。 >それと、4行目の >awk < $i > /tmp/foo >の部分を詳しく教えていただけないでしょうか。 >for i in abc_*という書き方からして、 >iは、abcファイルたちの添字ですよね? 違います。 for loopでは、ls abc_*で表示されるファイル、つまりabc_1、abc_2が順にiに代入されてループが実行されます。 >すると、この$は何を意味するのでしょうか? iに代入されたものを参照するときは$iと書きます。 >また、awkは、基本的には >「awk 処理 ファイル名」 >という順に記述すると思いますが、4~7行目は逆になっています。 for loopを展開して書くと、 awk < abc_1 > /tmp/foo mv /tmp/foo abc_1 awk < abc_2 > /tmp/foo mv /tmp/foo abc_2 となります。 awkの処理の記述は省略しました。 man bashして、変数の参照と、for loopについて読んでみて下さい。
- mac_res
- ベストアンサー率36% (568/1571)
それぞれのファイルにアクセスして、それぞれに共通した処理をしたいのでしょうか?それでしたら、以下に示すようにshell scriptを併用したほうがやりやすいと思います。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #! /bin/bash for i in abc_* do awk < $i > /tmp/foo ' { print "date " $1 }' mv /tmp/foo $i done -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- もしくはそれぞれにアクセスしてその集計をし1つの結果を得たいのでしょうか? もう少し具体的にやりたいことを書いてください。
お礼
ありがとうございます。 お返事が遅れてしまって申し訳ないです。 >それぞれのファイルにアクセスして、それぞれに共通した処理をしたいのでしょうか? そういうことです。 /tmp/fooにabc_1、abc_2、scriptファイルをおいて 試しにやってみましたところ、 ./test.script: line 6: /tmp/foo: Is a directory mv: cannot overwrite non-directory `abc_1' with directory `/tmp/foo' というエラーメッセージになってしまいます。 それと、4行目の awk < $i > /tmp/foo の部分を詳しく教えていただけないでしょうか。 for i in abc_*という書き方からして、 iは、abcファイルたちの添字ですよね? すると、この$は何を意味するのでしょうか? また、awkは、基本的には 「awk 処理 ファイル名」 という順に記述すると思いますが、4~7行目は逆になっています。
お礼
できました。ありがとうございました。