私は科学インターンシップの間に主にいくつかのユーティリティを使用してInixターミナルを使用した経験を得ましたがgrep
、私がしなければならない数字をより効率的に処理できるようにしばらく見つけようとしました。 。awk
sed
run.awk
多数のテキストファイルに対していくつかのタスクを実行するスクリプトがあります。実際にファイルをインポートしてchloride.out
データを抽出して作成しますchloride.cm
。
とにかく、このスクリプトにシェルの初期ワイルドカードフレーズに基づいてファイルを受信して書き込むことができますか*.out
?*.cm
大量のデータを処理するために作成したスクリプトの数が100回を超え、本当に迷惑です。
理想的には、すべてのスクリプトに対してシェルを介してこれを行う方法があるかどうかを知りたいです。シェルまたはそれに対応するツールで自動化できない場合は、少なくともawk
私が説明したのと同様の方法でスクリプトを自動化できますか?
ベストアンサー1
もちろん、awkにワイルドカードを介して複数のファイルを処理させることもできます。 1つの提案は、これをrun.awk
単一のファイルを受け入れ、単一の出力ファイルを生成する一般的な「関数」に保ち、入力と出力ファイルの同化を担当できる他のスクリプトから呼び出すことです。
はい
これはBashスクリプトになり、と呼ぶことができますawk_runner.bash
。
#!/bin/bash
for ifname in *.out; do
ofname=${ifname/.out/.cm}
printf "IN: %s, OUT: %s\n" $ifname $ofname
printf "running run.awk with %s & %s\n\n" $ifname $ofname
run.awk $ifname $ofname
done
サンプルの実行
いくつかのテストファイルを含むサンプルディレクトリを作成しました。
$ touch file{1..4}.out
その結果、4つのファイルが作成されました。
$ ls -1
file1.out
file2.out
file3.out
file4.out
これでスクリプトを実行します。
$ ./awk_runner.bash
IN: file1.out, OUT: file1.cm
running run.awk with file1.out & file1.cm
IN: file2.out, OUT: file2.cm
running run.awk with file2.out & file2.cm
IN: file3.out, OUT: file3.cm
running run.awk with file3.out & file3.cm
IN: file4.out, OUT: file4.cm
running run.awk with file4.out & file4.cm
「running...」で始まる各行の後にスクリプトをここで実行できます。
リスト内のファイル
ワイルドカードを使用する代わりに、*.out
ファイル名のリストを含むファイルを使用するとします。例:
$ cat filelist.txt
file1.out
file2.out
file3.out
file4.out
while
ループの代わりにループを使用する変更されたバージョンのスクリプトを使用できますfor
。さて、このスクリプトのバリエーションを次のように呼びましょうawk_file_runner.bash
。
#!/bin/bash
while read ifname; do
ofname=${ifname/.out/.cm}
printf "IN: %s, OUT: %s\n" $ifname $ofname
printf "running run.awk with %s & %s\n\n" $ifname $ofname
run.awk $ifname $ofname
done < filelist.txt
このバージョンのスクリプトはファイルから入力を読み取りますfilelist.txt
。
done < filelist.txt
その後、ループが繰り返されるたびにコマンドを使用して入力ファイルから1行を読み取りますwhile
。read
while read ifname; do
awk
次に、ファイルの各行を繰り返しながらスクリプトを実行する最初のスクリプトと同じ方法ですべての操作を実行します。run.awk