Shell

外殼:同時讀取行嵌套

  • March 12, 2015

我有兩個文件: doc1.lst 和 doc 2.lst 我想獲取每一行的內容並將其作為我的 SQL 查詢的參數。

我試過這樣的東西,請糾正我

   file=doc1.lst
   while read line
   do
      p1=$line;

   file=doc2.lst
   while read line
   do
      p2=$line;

       sqlplus64 $User/$Pass@$ORACLE_SID << EOF2
       @update.sql p1 p2

   done < echo "Ok"
   done < echo "Ok"
   EOF2

問題是我想獲取每一行的值並將其作為參數(p1 和 p2),以便能夠更新我的表,如 sqlplus 查詢中所示。

為了更好地理解我的文件 doc1.lst 看起來像:

   AAA
   ABC
   EDF

還有我的文件 doc2.lst :

   30
   10
   30

我想用這些值來更新我的表。

據我了解(最後的<<EOF2東西不是很清楚),您追求的最終結果是將以下內容輸入sqlplus64

@update.sql AAA 30
@update.sql ABC 10
@update.sql EDF 30

為了產生這個,你可以將它們組合起來,而不是循環遍歷兩個文件的內容。paste在兩個文件上使用( paste doc1.lst doc2.lst) 給出

AAA     30
ABC     10
EDF     30

paste預設情況下與選項卡連接)。paste -d ' ' doc1.lst doc2.lst用給定更改分隔符

AAA 30
ABC 10
EDF 30

然後我們需要添加@update.sql作為前綴;這可以用 來完成sed,將每行的開頭 ( ^) 替換為前綴:

paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'

產生期望的結果。

然後可以將其一次性輸入sqlplus64

paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /' | sqlplus64 $User/$Pass@$ORACLE_SID

如果您需要exit在腳本末尾輸入sqlplus64

(paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'; echo exit) | sqlplus64 $User/$Pass@$ORACLE_SID

如果您真的想逐行執行,您可以while read將結果的每一行都提供給它sqlplus64

引用自:https://unix.stackexchange.com/questions/189541