
最近在学习一些shell的基本语法操作,收获了很多之前没有了解到的新姿势。当然参考书籍是这本《Linux命令行与shell脚本编程大全》,强烈推荐对shell脚本不太熟悉的同学好好阅读下该教材。对shell命令的讲解可谓循序渐进,娓娓道来,让人如沐春风的赶脚。
ok,这篇文章的话题是关于文件输入输出重定向的,关于重定向的概念这里我不赘述。我要说的重点是,在平时的工作中,可能有些做数据分析或者大数据的同学,经常会遇到的场景是,我手中有一份csv格式的数据文件,我想让这些数据自动生成sql insert语句,转换生成sql文件。该怎么做呢?
当然解决这样的难题方法不止一种,包括使用ide工具导入csv文件,这里我要介绍的做法,是使用shell脚本去转化这样的文件。废话不多说,看代码:
outfile="member.sql"
IFS=","
while read lname fname address city state zip
do
cat >> $outfile << EOF
insert into members(lname,fname,address,city, state,zip) values ('$lname','$fname',
'$address','$state','$zip');
EOF
done < ${1}
这个脚本很短小,这都要感谢有文件重定向。脚本中出现了三处重定向操作。while循环使用read语句从数据文件读取特定格式的数据文本。注意在done语句出现了重定向符号:
done < ${1}
$1 代表第一个命令行参数,它指明了待读取数据的文件路径。
read语句会使用IFS字符解析读入的文本,这里使用逗号来间隔文本。
脚本的另外两处重定向操作出现在同一条语句:
cat >> $outfile << EOF
这条语句包含一个输出追加重定向(双大于号)和一个输入追加重定向(双小于号)。输出重定向将cat命令的输出追加到由$outfile指定的文件中,cat命令的输入不再取自标准输入,而是被重定向到脚本存储的数据。EOF符合标记了追加到文件中的数据的起止。
执行完上面的脚本会生成对应的标准的insert into的sql文件。当然,sql文件中对应的表名称和字段名称需要根据自己的实际需要做修改即可。