ファイルを繰り返し、両方の列の値を変数として読み込みます。

ファイルを繰り返し、両方の列の値を変数として読み込みます。

data.dat3つの列を持つファイル()があります。シェルスクリプトを使用してそれらの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使用します。colsed

答え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

関連情報