![循环文件并将两列中的值读取到变量中](https://linux22.com/image/49775/%E5%BE%AA%E7%8E%AF%E6%96%87%E4%BB%B6%E5%B9%B6%E5%B0%86%E4%B8%A4%E5%88%97%E4%B8%AD%E7%9A%84%E5%80%BC%E8%AF%BB%E5%8F%96%E5%88%B0%E5%8F%98%E9%87%8F%E4%B8%AD.png)
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
您可以将两列保存在gawk
print$2
和 中$3
。然后,将它们提取到单独的变量中a1
并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