2017-01-31 79 views
1

我在AIX使用ksh,我需要一些幫助,因爲我無法通過sedawk來實現。
模板文件:(其用作輸入)如何替換文件中的字符串與其他文件的內容

... 
varchar SelectStmt = 'REPLACE_SELECT_STATEMENT' 
... 

應該施加值(派生基於在Teradata的表名的輸入和分別和鑄造比較每個列的列數據類型他們在任何需要的地方)通過awk實現並重定向到一個文件,它有很多行(> = 100和< = 500)。

我正在讀取該文件,需要將文件內容替換爲模板文件的上述語句。我試圖

v_select_stmnt=`cat awk_output_file.txt`; 
sed 's/REPLACE_SELECT_STATEMENT/"$v_select_stmnt"/g' 
        Template_file.txt > /directory1/final_script.txt; 

即使試圖用awk_output_file.txt的awk作爲

awk -v a_select_stmnt="$v_select_stmnt" ' 
{ if ($0 ~ /REPLACE_SELECT_STATEMENT/) { 
     sub(REPLACE_SELECT_STATEMENT,a_select_stmnt,$0); } 
     print $0 > "/directory1/final_script.txt" }' Template_file.txt 

示例內容:(可有單引號,分號)

SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)), 
     CAST(COLUMN3 AS VARCHAR(40)), COLUMN4, 
     .... 
     CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31'; 

的預期輸出

... 
    varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)), 
      CAST(COLUMN3 AS VARCHAR(40)), COLUMN4, 
      .... 
      CAST(COLUMN600 AS INTEGER) 
    FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';' 
... 

你能幫我解決這個問題嗎?由於select聲明可能很大,因此需要保留new-line字符以使其可讀。如果可能的話,請您發佈如何在sedawk中解決這個問題。感謝您的時間。

回答

1

模板文件

$ cat temp 
... 
varchar SelectStmt = 'REPLACE_SELECT_STATEMENT' 
... 

內容

$ cat output 
SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)), 
     CAST(COLUMN3 AS VARCHAR(40)), COLUMN4, 
     .... 
     CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31'; 

awk中

假設你的輸出文件不包含&,因爲它會被替換操作

$ awk 'NR==FNR{r=(FNR>1?r RS:"") $0; next} {gsub(/REPLACE_SELECT_STATEMENT/,r)}1' output temp 

更好的閱讀的版本

awk ' # Here read output file and save contents in variable r 
     NR==FNR{ 
      r=(FNR>1?r RS:"") $0 
      next 
     } 

     # Here read file temp 
     { 
      gsub(/REPLACE_SELECT_STATEMENT/,r) 
     }1 
    ' output temp 

如果它包含然後輸出文件&焦炭,解釋

awk 'BEGIN{search="REPLACE_SELECT_STATEMENT"}NR==FNR{r=(FNR>1?r RS:"") $0; next} s=index($0,search){ $0 = substr($0,1,s-1) r substr($0,s+length(search)) }1' output temp 

更好的閱讀的版本

awk 'BEGIN{ 
     search="REPLACE_SELECT_STATEMENT" 
} 
NR==FNR{ 
     r=(FNR>1?r RS:"") $0 
     next 
} 
# To take care of & char, credit : Ed Morton 
s=index($0,search){ 
     $0 = substr($0,1,s-1) r substr($0,s+length(search)) 
}1' output temp 

兩者給人輸出

... 
    varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)), 
      CAST(COLUMN3 AS VARCHAR(40)), COLUMN4, 
      .... 
      CAST(COLUMN600 AS INTEGER) 
    FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';' 
... 

的Perl

$ perl -pe 's/REPLACE_SELECT_STATEMENT/`cat output`/ge' temp 
... 
varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)), 
     CAST(COLUMN3 AS VARCHAR(40)), COLUMN4, 
     .... 
     CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31'; 
' 
... 
+1

完美的作品。謝謝Akshay Hegde。 – chill3chee

相關問題