当前位置: 技术问答>linux和unix
不会做这个SHELL,请大家帮忙,有没有最简单的方法?
来源: 互联网 发布时间:2015-03-07
本文导语: 我想实现这样一个功能,由SHELL程序读入3个文本文件中的内容,同时作为我SHELL的变量。例如: cat file1 1 2 3 cat file2 aaa bbb ccc cat file3 aa bb cc SHELL里写上echo "insert table values('$num','$char','$char2') 最终得到如下文件 insert...
我想实现这样一个功能,由SHELL程序读入3个文本文件中的内容,同时作为我SHELL的变量。例如:
cat file1
1
2
3
cat file2
aaa
bbb
ccc
cat file3
aa
bb
cc
SHELL里写上echo "insert table values('$num','$char','$char2')
最终得到如下文件
insert table values('1','aaa','aa')
insert table values('2','bbb','bb')
insert table values('3','ccc','cc)
cat file1
1
2
3
cat file2
aaa
bbb
ccc
cat file3
aa
bb
cc
SHELL里写上echo "insert table values('$num','$char','$char2')
最终得到如下文件
insert table values('1','aaa','aa')
insert table values('2','bbb','bb')
insert table values('3','ccc','cc)
|
下面的shell文本能够帮你完成输出,不过没有按照你给出的格式,那样反倒麻烦了。
count=1
total_line=`cat file1|wc -l`
while
test "${count}" -le "${total_line}"
do
awk "NR==$count {printf "insert table values('%s',", $0 }" file1
awk "NR==$count {printf "'%s',", $0 }" file2
awk "NR==$count {printf "'%s')n", $0 }" file3
count=`expr $count + 1`
done|cat>result.txt
一些说明:
3个file都要在执行文件目录下。
输出在result.txt文件中。
输出的格式很不爽,不过好像没有其他好办法,——我对awk不是很熟练。
count=1
total_line=`cat file1|wc -l`
while
test "${count}" -le "${total_line}"
do
awk "NR==$count {printf "insert table values('%s',", $0 }" file1
awk "NR==$count {printf "'%s',", $0 }" file2
awk "NR==$count {printf "'%s')n", $0 }" file3
count=`expr $count + 1`
done|cat>result.txt
一些说明:
3个file都要在执行文件目录下。
输出在result.txt文件中。
输出的格式很不爽,不过好像没有其他好办法,——我对awk不是很熟练。
|
paste file1 file2 file3|awk '{print "insert table values("" $1 "","" $2 "","" $3 "")" }'|sed 's/"/'/g'>targetfile
|
不好意思,打个补丁:
把后面改成:
|sed "s/"/'/g" >targetfile
如果你不想出现变量不够的情况,就在awk后加个条件
NF==3,变成这样:
paste file1 file2 file3|awk ' NF == 3 { print "insert table values("" $1 "","" $2 "","" $3 "")" }'|sed "s/"/'/g" >targetfile
就可以了,
这样可以把下例中的后两行滤掉:
cat file1
1
2
3
4
cat file2
aaa
bbb
ccc
cat file3
aa
bb
cc
dd
ee
cat targetfile
insert table values('1','aaa','aa')
insert table values('2','bbb','bb')
insert table values('3','ccc','cc)
把后面改成:
|sed "s/"/'/g" >targetfile
如果你不想出现变量不够的情况,就在awk后加个条件
NF==3,变成这样:
paste file1 file2 file3|awk ' NF == 3 { print "insert table values("" $1 "","" $2 "","" $3 "")" }'|sed "s/"/'/g" >targetfile
就可以了,
这样可以把下例中的后两行滤掉:
cat file1
1
2
3
4
cat file2
aaa
bbb
ccc
cat file3
aa
bb
cc
dd
ee
cat targetfile
insert table values('1','aaa','aa')
insert table values('2','bbb','bb')
insert table values('3','ccc','cc)
|
太难,建议你放弃用shell的方法,如果用awk,即使实现了,运行效率也非常低。我能想到的就是循环读一行。如果有一万行,那就是一万的三次方,不可能这样运行。
你朋友教的方法比较好,用数据库,建表。非常快!
你朋友教的方法比较好,用数据库,建表。非常快!