
data.dat
3つの列を持つファイル()があります。シェルスクリプトを使用してそれらの2つを読み、内容をテンプレートファイルに埋めたいと思います。ファイルは次のようになります。
12 180 2390
14 177 2210
16 173 2130
...
これまでは、次の変数(データファイルの列2)を使用してこれを実行できます。
for a in `cat data.dat | gawk '{print $2}'`; do
sed s/A/$a/ daily.template daily.template > daily.inp
done
列3も読み込み、列2と同じ行の対応する値(b)を同じテンプレートに割り当てようとします。テンプレートには「A」と「B」という変数が含まれています。 bのすべての値に対してaのすべての値を繰り返したくないため、入れ子になったforループを実行することはできません。
この目標をどのように達成できますか?
次に追加:
まず、すべての助けに感謝します!
はい、daily.templateファイルに関する詳細情報を提供すると、理解しやすくなります。次のように見えます。
dens_column O3 300.00
dens_column h20 B
sza A
day_of_year 172
output sum
...
AとBはラインのすべてのループで交換する必要があります。 data.datの最初の列は意味がなく、測定された時間のみを表示し、このパラメータは「daily.inp」では必要ありません。各行には、AとBがその行の列2と列3の対応する値に置き換えられる「daily.inp」があります。 daily.inp ファイルは次のとおりです。
dens_column O3 300.00
dens_column h20 2390
sza 180
day_of_year 172
output sum
...
その後、次のファイルが分離されます。
dens_column O3 300.00
dens_column h20 2210
sza 177
day_of_year 172
output sum
...
など...
答え1
もしそうなら、これは単に質問になるでしょう:
while read discard x y discard; do
sed "s/A/$x/g;s/B/$y/g" < daily.template > "daily.$x-$y.inp"
done < data.dat
このread
コマンドは一度に1行ずつ読み取り、最初のdata.dat
フィールド(スペースで区切られたフィールド、バックスラッシュを使用してフィールド、または行区切り文字をエスケープできます)を変数に入れ、2番目のフィールドを変数に入れ$discard
ます$x
。$y
残りのフィールドはのフィールドに配置されます$discard
。
答え2
gawk
印刷$2
とに両方の列を保存できます$3
。次にそれを別々の変数に抽出し、a1
ここでは2つのテンプレート変数をa2
使用します。col
sed
答え3
これを行うには、termsqlを使用できます。
while read a b; do
termsql -xwi daily.template "update tbl set COL2='$a' where COL1='h20'; update tbl set COL1='$b' where COL0='sza'" > daily$a$b.inp
done < <(termsql -wi data.dat "select COL1,COL2 from tbl")
利点:SQLを知っている場合は、新しい構文を学ぶ必要はありません。
ここでtermsqlを得ることができます: https://gitorious.org/termsql