发布网友 发布时间:2022-05-02 13:01
共4个回答
懂视网 时间:2022-05-02 17:22
话说Linux处理文本工具有三剑客,awk、grep、sed,其中awk最为厉害,grep也挺是常用。今天就来说一说awk,并结合mysql应用。
1.语法 |
awk ‘{[pattern] action}‘ {filenames}
用法有很多种,但是语法总结可以写成这样,分两个部分:pattern (条件) + action(处理动作)。
pattern表示 awk 在数据中查找的内容,是一些正则表达式或条件判断,这个选项也可以省略。
action是指在匹配到内容后,要执行的命令。
2.awk原理 |
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
具体过程可以用这样的伪代码来描述
While(还有下一行) { 1:读取下一行,并把下一行赋给$0,各列赋给$1,$2...$N变量 2: 用指定的命令来处理该行 }
下面看一个例子:city.txt文本中有5行2列数据
[root@021rjsh216086s ~]# cat city.txt BJ 010 SH 021 TJ 022 HZ 0657 ZZ 0371
执行awk相关命令
[root@021rjsh216086s ~]# awk ‘{print $0}‘ city.txt #$0表示一行的所有列 BJ 010 SH 021 TJ 022 HZ 0657 ZZ 0371 [root@021rjsh216086s ~]# awk ‘{print $1}‘ city.txt #$1表示一行的第一列 BJ SH TJ HZ ZZ [root@021rjsh216086s ~]# awk ‘{print $2}‘ city.txt #$2表示一行的第二列 010 021 022 0657 0371
再看第二个例子,city.txt 以竖线为分隔符。想要把数据分开,便用-F参数。
[root@021rjsh216086s ~]# cat city.txt BJ | 010 | a SH | 021 | b TJ | 022 | c HZ | 0657| d ZZ | 0371| e
[root@021rjsh216086s ~]# awk ‘BEGIN{FS="|"} {print $1}‘ city.txt #或 awk -F"|" ‘{print $1}‘ city.txt
BJ
SH
TJ
HZ
ZZ
假如分隔符同时存在多种,竖线,问好,逗号。-F参数可以指定多个。
[root@021rjsh216086s ~]# cat city.txt BJ | 010 ? a SH | 021 ? b TJ | 022 , c HZ | 0657, d ZZ | 0371, e [root@021rjsh216086s ~]# awk -F ‘[|?,]‘ ‘{print $1,$2,$3}‘ city.txt #同时指定三个分隔参数 BJ 010 a SH 021 b TJ 022 c HZ 0657 d ZZ 0371 e
参考文章:
Mysql分析-awk+Threads分析状态
Linux三剑客之awk命令
Linux awk 命令
AWK程序设计语言
awk分析mysql状态
标签:target 工具 txt 数据 pat 部分 linux三剑客 逗号 sdn
热心网友 时间:2022-05-02 14:30
懂awk,知道如何从文件中取出值,但数据库语句不太熟悉,能否给出最终组织的数据库语句?
我只能先写到这里:
#!/bin/sh就一条语句。
awk对两个文件的处理,参见我的百度空间中shell分类下的文章《shell - awk - sed》,看看其中的awk章节。
热心网友 时间:2022-05-02 15:48
自己去改写吧:追问对,需要截取后3位,如'A01'写入数据库。可能没描述清楚,数据库表中group字段是主键,我需要的脚本是分割文件记录后根据主键查询更新数据库的money和word字段
追答数据已经处理好了,剩下的就用load data local infile导入数据库吧。师兄只能帮你到这里了
热心网友 时间:2022-05-02 17:23
使用shell编程可解决,这个事sql+shell的问题