awk命令是处理文件的行命令,文件的每一行都会按照指定的方式去处理.
尤其是在数据库批量操作的情况下,使用行命令加行命令的语法迅速的写sql语句,然后配合mysql命令行 -N < sql文件 执行sql命令非常高效
下面是awk 命令的详解
{} 命令代码块,包含一条或多条命令, 多条命令使用分号分隔
-F 指定分隔符 , 比如$0 表示整行,$1,$2指第一列和第二列,-F参数就是指定以什么字符划分每一列.比如使用空格区分 -F " "
$0 表示整个当前行
$1 表示每行的第1 个字段,同理 $2 表示每行的第二个字段, awk 是根据空格分隔每个字段的.
printf(格式化打印命令)是awk打印指定内容的主要命令
示例:
比如 out.txt 里面有很多这种语句行 123金融业 数字代表oid 金融业代表industry, oid每个都不相同
现在有一个sql 语句 delete from yq_annotated_tag where oid = "" and industry = "" and batch_id="" and status = 0 limit 1;
需要将这个文件中的oid 和industry 对应到sql 语句中并用mysql 去执行,就可以使用强大的awk命令
awk -F " " "{printf('delete from yq_annotated_tag where oid =\"%s\" and industry = \"%s\" and batch_id="" and status = 0 limit 1;', $1,$2)}" out.txt > delete_sql.sql
这样就输出了很多条sql语句到delete_sql.sql ,这个时候使用mysql命令行执行sql文件
mysql -uroot -pmysql -N < delete_sql.sql 就能执行了
示例2:
awk -F " " '{printf("%s\n", $2) }' feeds.txt
注意: {} 外面必须使用单引号,不能使用双引号, printf 里面使用双引号,不能使用单引号
使用这种方式比开发一个脚本去执行文件读取在拼接sql字符串 ,之后用pymsql 连接mysql 执行每一条命令快速的多
使用awk命令打印指定行
打印文件的第m行数据
awk 'NR==m {printf("%s",$0)}' 文件名
或者
awk 'NR==m {print $0}' 文件名
打印文件的第m行到第n行
awk 'NR==m NR==n {print $0}' file_name
or
awk 'NR==m NR==n {printf("%s",$0)}' file_name