使用shell脚本将值传递到另一个文件
我想创建一个shell脚本文件,以便从.dat或excel .xls文件获取特定值,然后将这些值传递给另一个文件,如以下示例中所示;使用shell脚本将值传递到另一个文件
1-的.dat值具有32x5矩阵大小;实施例
1 3 4 5 6
4 5 7 9 8
:
:
1 1 1 2 4
2- .geo文件具有以下
x1= ;
x2= ;
x3= ;
x4= ;
x5= ;
我想创建32地理文件用的每一行例如.dat或.xls文件 1.geo has;
x1 = 1;
x2 = 3;
x3 = 4;
x4 = 5;
x5 = 6;
2.geo已通过行的第二行等
综上所述,shell脚本循环,并将它们传递给地理文件,并用不同的地理文件名保存。
任何帮助,将不胜感激。
非常感谢,
你的运动实际上是简单地通过读取每个行成单独的变量处理,例如$a
,$b
,$c
,$d
和$e
。一旦阅读,您可以用printf
的格式将它们写入单独的$count.geo
文件(例如1.geo
,2.geo
,...)中。一个简单的实现是:
#!/bin/sh
dat=${1:-geo.dat} ## .dat filename ('geo.dat' default)
count=1
test -r "$dat" || { ## validate input file is readable
printf "error: file not readable '%s'\n" "$dat"
exit 1
}
while read -r a b c d e; do ## read each value into a b c d e
printf "x1 = %d;\nx2 = %d;\nx3 = %d;\nx4 = %d;\nx5 = %d;\n" \
$a $b $c $d $e >$count.geo
((count++))
done <"$dat"
使用awk
,你可以使用一个班轮类似:
awk '{printf "x1 = %d;\nx2 = %d;\nx3 = %d;\nx4 = %d;\nx5 = %d;\n", \
$1, $2, $3, $4, $5 > FNR".geo"}' geo.dat
例输入文件geo.dat
$ cat geo.dat
5 9 4 4 2
8 4 3 8 7
5 8 4 3 7
1 3 9 8 2
5 8 2 2 1
7 1 8 3 4
3 7 4 7 2
5 6 6 9 5
3 4 4 8 6
2 9 9 1 7
2 6 5 4 8
5 1 9 4 3
4 6 1 7 5
2 4 1 7 3
6 2 6 1 9
3 3 9 3 4
6 5 9 2 8
8 7 8 8 2
1 2 9 1 1
4 3 5 5 1
8 2 2 5 3
2 7 5 1 1
9 6 5 9 8
4 9 6 2 8
8 3 1 7 4
2 1 6 7 7
7 5 9 9 9
2 3 7 8 3
9 8 1 5 7
9 9 7 6 1
6 4 5 7 2
8 9 3 6 6
示例使用
$ sh readgoedat.sh geo.dat
或
$ awk '{printf "x1 = %d;\nx2 = %d;\nx3 = %d;\nx4 = %d;\nx5 = %d;\n", \
$1, $2, $3, $4, $5 > FNR".geo"}' geo.dat
示例输出文件过来,
$ cat 1.geo
x1 = 5;
x2 = 9;
x3 = 4;
x4 = 4;
x5 = 2;
$ cat 2.geo
x1 = 8;
x2 = 4;
x3 = 3;
x4 = 8;
x5 = 7;
$ cat 32.geo
x1 = 8;
x2 = 9;
x3 = 3;
x4 = 6;
x5 = 6;
看的东西,让我知道,如果您还有其他问题。
上帝保佑兰金先生!将值打印成1.geo .... 32.geo是完美的。然而,在我的情况下,我有所有.geo文件准备从1,...除了我只需要将x1,x2,x3,x4和x5放入每个现有的地理文件中。以下是一个.geo文件的例子。 – user3780018
/* // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> */ D = 1.02; // X1 = 0.1; // X2 = 0.06; // X3 = 0.51; // T11 = 1; // X4 = -0.02; // X5 = 1.1; // LT = 0; detn = 0.4; detd = 0.44; c1n = 2; c2n = 4; c3n = 5; c1d = 4; c2d = 6; c3d = 4; /* // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (e == 30) y = 1.2e-3; // EndIf If(e == 50)如果(e == 30) y = 1.2e-3; // EndIf If(e == 50) y = 2.1e-3; // EndIf 如果(e == 70) y = 2.9e-3;点(1)= {-7.5 * D,10 * D,0,0}; – user3780018
现在的问题是,它将值打印到现有的地理文件中,但会删除其余的值。非常感谢您的帮助! – user3780018
你到目前为止尝试过什么? '读取-r行;做...',之前有'declare -i count'可以工作。 –
非常感谢您的回复!我实际上尝试过与DAKOTA一起提供的文件,但它不适用于我。如果你能提供你的想法的例子,将不胜感激。谢谢, – user3780018
注意答案是POSIX shell兼容。如果你有像bash这样的高级shell,你可以选择使用数组。无论哪种情况,您都可以使用* heredoc *而不是'printf'。 'awk'也提供了一个简单的解决方案。 –