Unix 如何用其他文件的内容替换文件中的字符串
我使用Unix 如何用其他文件的内容替换文件中的字符串,unix,awk,sed,Unix,Awk,Sed,我使用ksh在AIX上,我需要一些帮助,因为我无法通过sed或awk实现 模板文件:(作为输入) ... varchar SelectStmt = 'REPLACE_SELECT_STATEMENT' ... 上述中应应用的值(基于Teradata中表名的输入,分别比较每列的列数据类型,并在必要时强制转换)通过awk实现,并重新定向到一个文件,该文件有多行(>=100和模板文件 $ cat temp ... varchar SelectStmt = 'REPLACE_SELECT_S
ksh
在AIX
上,我需要一些帮助,因为我无法通过sed
或awk
实现
模板文件:(作为输入)
...
varchar SelectStmt = 'REPLACE_SELECT_STATEMENT'
...
上述中应应用的值(基于Teradata中表名的输入,分别比较每列的列数据类型,并在必要时强制转换)通过awk实现,并重新定向到一个文件,该文件有多行(>=100和模板文件
$ 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
假设输出文件不包含将被解释的&
通过更换操作
可读性更好的版本
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 ' # 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
}
# 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
如果输出文件中包含&
字符
可读性更好的版本
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 ' # 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
}
# 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';'
...
...
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';
'
...
非常好,谢谢你,阿克谢·赫格德。
$ 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';
'
...