use*_*489 5 shell-script text-processing
我有一个data.dat包含 3 列的文件 ( )。我想用 shell 脚本读入其中的两个并将内容填充到模板文件中。该文件如下所示:
12 180 2390
14 177 2210
16 173 2130
...
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以用一个变量(数据文件中的第 2 列)来做到这一点,如下所示:
for a in `cat data.dat | gawk '{print $2}'`; do
sed s/A/$a/ daily.template daily.template > daily.inp
done
Run Code Online (Sandbox Code Playgroud)
现在我也想读取第 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
...
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
然后将下一个文件分开:
dens_column O3 300.00
dens_column h20 2210
sza 177
day_of_year 172
output sum
...
Run Code Online (Sandbox Code Playgroud)
等等...
那么这应该只是一个问题:
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
Run Code Online (Sandbox Code Playgroud)
该read命令将从 一次读取一行data.dat,将第一个字段(字段以空白分隔,并且可以使用反斜杠对字段或行分隔符进行转义的地方)放在变量中$discard,第二个输入$x,第三个输入$y和其余的中的字段$discard。
| 归档时间: |
|
| 查看次数: |
44422 次 |
| 最近记录: |