工作中遇到这样的一个场景:从另一个系统生成了两个文件,需要把两个文件通过某列合并成一个文件。因为之后需要对该文件进行检索,放到数据库中,是一种选择。
第一步:去掉文件第一行头
sed -i '1d' $FILE1
mac下面,需要写成:sed -i '' '1d' $FILE1 BSD和linux,对sed的支持不一样。
第二步:把原来的分隔符^A替换成逗号。
cat $FILE1 awk -v OFS=''\'','\''' -F"\001" '{$1=$1;for(i=1;i
在shell终端可以通过 sed -e 's/^A/\t/g’ filename 来替换。但是在script中,^A输入成问题。转而用了awk。
OFS 指定输出各个字段分隔符
单引号‘ 需要采用转义的写法: '\''
-F "\001" 指定分隔符。 ^A的十六进制表示为\001
$1=$1 对某个字段修改,让输出分隔符生效
for循环 对每列的值检验,如果是null的,设置成null字符串。
最后输出时多加一个行号。
示例:1','sd','day','city
第三步:生成sql语句
cat $FILE1.new awk -v DATA_TYPE="$DATA_TYPE" -v OFS=',' -F"," 'BEGIN{ flag="'\''null'\''"} { for(i=1;i
对每行数据变成数据库的插入语句。
-v P="$P" 是往AWK传递外部变量。
-F“,” 通过逗号分隔,把单引号留给各个字段。
BEGIN 定义一个‘null’字符串,带有单引号。
for循环,检验每列,如果是‘null’,设置成null。
把该行数据放置在values中。前后加上了单引号,符合sql语法。
以上OK,可以插入数据库。但是一个文件形成了几十W以上的数据量时,效率问题浮现。
第四步:生成批量插入的sql语句
cat $FILE1.new awk -v DATA_TYPE="$DATA_TYPE" -v OFS=',' -F"," 'BEGIN{ flag="'\''null'\''";buffer="";gap=""}{ for(i=1;i
形成批量的插入语句提高效率。
预定义了buffer字符串。
每一行的数据先和buffer累加。 awk中字符串链接用a""b 来实现。
NR 是当前处理的行数。从1开始。如果NR=30 达到批量,则输出。
END块,是结束的时候执行。如果buffer不为空,则继续输出。
end
领取专属 10元无门槛券
私享最新 技术干货