awk命令是處理文件的行命令,文件的每一行都會(huì)按照指定的方式去處理.
尤其是在數(shù)據(jù)庫(kù)批量操作的情況下,使用行命令加行命令的語(yǔ)法迅速的寫sql語(yǔ)句,然后配合mysql命令行 -N < sql文件 執(zhí)行sql命令非常高效
下面是awk 命令的詳解
{} 命令代碼塊,包含一條或多條命令, 多條命令使用分號(hào)分隔
-F 指定分隔符 , 比如$0 表示整行,$1,$2指第一列和第二列,-F參數(shù)就是指定以什么字符劃分每一列.比如使用空格區(qū)分 -F " "
$0 表示整個(gè)當(dāng)前行
$1 表示每行的第1 個(gè)字段,同理 $2 表示每行的第二個(gè)字段, awk 是根據(jù)空格分隔每個(gè)字段的.
printf(格式化打印命令)是awk打印指定內(nèi)容的主要命令
示例:
比如 out.txt 里面有很多這種語(yǔ)句行 123金融業(yè) 數(shù)字代表oid 金融業(yè)代表industry, oid每個(gè)都不相同
現(xiàn)在有一個(gè)sql 語(yǔ)句 delete from yq_annotated_tag where oid = "" and industry = "" and batch_id="" and status = 0 limit 1;
需要將這個(gè)文件中的oid 和industry 對(duì)應(yīng)到sql 語(yǔ)句中并用mysql 去執(zhí)行,就可以使用強(qiáng)大的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語(yǔ)句到delete_sql.sql ,這個(gè)時(shí)候使用mysql命令行執(zhí)行sql文件
mysql -uroot -pmysql -N < delete_sql.sql 就能執(zhí)行了
示例2:
awk -F " " '{printf("%s\n", $2) }' feeds.txt
注意: {} 外面必須使用單引號(hào),不能使用雙引號(hào), printf 里面使用雙引號(hào),不能使用單引號(hào)
使用這種方式比開發(fā)一個(gè)腳本去執(zhí)行文件讀取在拼接sql字符串 ,之后用pymsql 連接mysql 執(zhí)行每一條命令快速的多
使用awk命令打印指定行
打印文件的第m行數(shù)據(jù)
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