awk的小技巧

工作中遇到这样的一个场景:从另一个系统生成了两个文件,需要把两个文件通过某列合并成一个文件。因为之后需要对该文件进行检索,放到数据库中,是一种选择。

第一步:去掉文件第一行头

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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180124G00N6Y00?refer=cp_1026

扫码关注云+社区