循环文件并将两列中的值读取到变量中

循环文件并将两列中的值读取到变量中

data.dat我有一个包含 3 列的文件 ( )。我想用 shell 脚本读入其中两个并将内容填充到模板文件中。该文件如下所示:

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”的变量。我无法执行嵌套 for 循环,因为我不想在 b 的每个值上迭代 a 的每个值。

我怎样才能实现这个目标?

添加:

首先感谢您的所有帮助!

是的,如果我提供有关 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”中不需要此参数。我只想要每一行都有一个“daily.inp”,其中 A 和 B 被替换为相应行中第 2 列和第 3 列的相应值。所以 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命令将从 中一次读取一行data.dat,将第一个字段(字段以空格分隔,其中反斜杠可用于转义字段或行分隔符)放入变量 中$discard,将第二个字段放入 中$x,将第三个字段放入变量中$y,其余字段放入中的字段$discard

答案2

您可以将两列保存在gawkprint$2和 中$3。然后,将它们提取到单独的变量中a1a2使用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

相关内容