2017-07-18 129 views
0

我想創建一個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腳本循環,並將它們傳遞給地理文件,並用不同的地理文件名保存。

任何幫助,將不勝感激。

非常感謝,

+0

你到目前爲止嘗試過什麼? '讀取-r行;做...',之前有'declare -i count'可以工作。 –

+0

非常感謝您的回覆!我實際上嘗試過與DAKOTA一起提供的文件,但它不適用於我。如果你能提供你的想法的例子,將不勝感激。謝謝, – user3780018

+0

注意答案是POSIX shell兼容。如果你有像bash這樣的高級shell,你可以選擇使用數組。無論哪種情況,您都可以使用* heredoc *而不是'printf'。 'awk'也提供了一個簡單的解決方案。 –

回答

0

你的運動實際上是簡單地通過讀取每個行成單獨的變量處理,例如$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; 

看的東西,讓我知道,如果您還有其他問題。

+0

上帝保佑蘭金先生!將值打印成1.geo .... 32.geo是完美的。然而,在我的情況下,我有所有.geo文件準備從1,...除了我只需要將x1,x2,x3,x4和x5放入每個現有的地理文件中。以下是一個.geo文件的例子。 – user3780018

+0

/* // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> */ 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

+0

現在的問題是,它將值打印到現有的地理文件中,但會刪除其餘的值。非常感謝您的幫助! – user3780018

相關問題