Posts tagged awk

awk -F”[[]]”和awk -F”[][]“分割出的串为什么不一样?

0

按理说 -F”[]“,[]表示匹配括号中的任何一个字符,[]中间的字符应该是和顺序无关的,可是我实验的结果却不一样,这是为什么呢?

 

echo “1[2]3[4]” | awk -F”[\\\\[\\\\]]” ‘{print $1,$2,$3,$4}’

 

有时候用6个^做分隔符的时候,就需要采用awk -F”[\\\\^\\\\^\\\\^\\\\^\\\\^\\\\^]” ‘{print $1}’

awk中使用单引号

0

看了一个帖子,是说明,如何在awk中使用单引号的,并举了一个例子,原文如下:

awk 中插入单引号需要转义,但是并不是想象中的那么简单。有点周折,发出来和大家共享。

awk ‘{print “INSERT INTO TABLE_NAME (COL1,COL2) VALUES (““’\’’“ $1 “’\’’“ “,“ “’\’’“ $2 “’\’’“ “)“ }’ DATA_FILE >abc.sql

其实,这是比较糟糕的方式,awk的单引号可以用\47 表示,原文中的例子可为:

awk ‘{print “INSERT INTO TABLE_NAME (COL1,COL2) VALUES (\47“$1“\47,\47“$2“\47);“ }‘ DATA_FILE >abc.sql

顺便说一句,原文中所使用的sql语句在“)”后面没有加“;”号,这会有问题的。

如何实现字符串不足N位自动补零

0

文本中有如下一列:
1
2
3
4
……
100
我想把它输出为:
0001
0002
0003
0004
……
0100

就是不足4位的前面补0

awk '{printf("%04d\n",$0);}' filename

awk输出时不换行

0

1.输出时使用printf
2.输出后,利用tr -d ‘n’实现替换换行
3.awk ‘BEGIN{ORS=”"}{print $0;}’ //推荐
4.awk ‘{printf(“%s”,$0);}’

awk常用函数以及变量参考

0

1.awk的常规表达式元字符
换码序列
^ 在字符串的开头开始匹配
$ 在字符串的结尾开始匹配
. 与任何单个字符串匹配
[ABC] 与[]内的任一字符匹配
[A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序)
[^ABC] 与除[]内的所有字符以外的任一字符匹配
Desk|Chair 与Desk和Chair中的任一个匹配
[ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。
* 与A、B或C中任一个出现0次或多次的字符相匹配
+ 与A、B或C中任何一个出现1次或多次的字符相匹配
? 与一个空串或A、B或C在任何一个字符相匹配
(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配

2.awk算术运算符
运算符用途
——————
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
–y y减1后使用y(前置减)
y– 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x

3.awk允许的测试:
操作符 含义
x==y x等于y
x!=y x不等于y
x>y x大于y
x>=y x大于或等于y
x< =y x小于或等于y
x~re x匹配正则表达式re
x!~re x不匹配正则表达式re

4.awk的操作符(按优先级升序排列)
= 、+=、 -=、 *= 、/= 、 %=
||
&&
>; >;= < <= == != ~ !~
xy (字符串连结,’x’’y’变成”xy”)
+ -
* / %
++ –

5.awk内置变量(预定义变量)
说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk
V 变量 含义 缺省值
——————————————————–
N ARGC 命令行参数个数
G ARGIND 当前被处理文件的ARGV标志符
N ARGV 命令行参数数组
G CONVFMT 数字转换格式 %.6g
P ENVIRON UNIX环境变量
N ERRNO UNIX系统错误消息
G FIELDWIDTHS 输入字段宽度的空白分隔字符串
A FILENAME 当前输入文件的名字
P FNR 当前记录数
A FS 输入字段分隔符 空格
G IGNORECASE 控制大小写敏感0(大小写敏感)
A NF 当前记录中的字段个数
A NR 已经读出的记录数
A OFMT 数字的输出格式 %.6g
A OFS 输出字段分隔符 空格
A ORS 输出的记录分隔符 新行
A RS 输入的记录他隔符 新行
N RSTART 被匹配函数匹配的字符串首
N RLENGTH 被匹配函数匹配的字符串长度
N SUBSEP 下标分隔符 “34″

6.awk的内置函数
V 函数 用途或返回值
————————————————
N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字符个数
N match(string,reg) 返回常规表达式reg匹配的string中的位置
N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
A substr(string,position,len) 返回一个以position开始len个字符的子串
P totower(string) 返回string中对应的小写字符
P toupper(string) 返回string中对应的大写字符
A atan(x,y) x的余切(弧度)
N cos(x) x的余弦(弧度)
A exp(x) e的x幂
A int(x) x的整数部分
A log(x) x的自然对数值
N rand() 0-1之间的随机数
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
G system() 返回自1970年1月1日以来经过的时间(按秒计算)

awk 笔记

0

实例一:
test.txt文件内容如下:
上海 291760
上海 5976
上海 75233
云南 4017
云南 63196
云南 8189
内蒙古 11227
内蒙古 54657
内蒙古 7289
北京 34902
北京 370128
北京 99264
吉林 11486
吉林 4826
吉林 88162
四川 16441
四川 179978
四川 18618
天津 10028
天津 130041
天津 17501
宁夏 13474
宁夏 16181
宁夏 376
安徽 123710
安徽 17193
安徽 7956
山东 35178
山东 485465
山东 55371
山西 116435
山西 15161
山西 19815

第一列是地区,第二列是出现的次数,将第一列相同的第二列数值相加,并显示?

awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}' test.txt

实例二:
如何取消科学计数显示?
使用OFMT=”%f”输出,如:

[root@root /]$echo '123456789123456' |awk '{print $0+0}'
1.23457e+14
[root@root /]$echo '123456789123456' |awk 'BEGIN{OFMT="%.0f"}{print $0+0}'
123456789123456

Shell运算,计算值保留两位小数

0

SHELL下是没有小数处理的,能进行运算的只能是-2^30到2^30-1范围的整数,否则溢出。
具体可以用的运算方式有:

[root@root ~]$ i=$[9 / 2]; echo i=$i;  
i=4

[root@root ~]$ i=$((9 / 2)); echo i=$i;  
i=4

[root@root ~]$ i=`expr 9 / 2` ; echo i=$i;
i=4

很多最小安装的系统不会有expr,可以使用内置命令:

[root@root ~]$ i=let i=9/2 ; echo i=$i;  
i=4

如果需要保留小数,比如两位小数,可以使用awk实现,awk真是强大:

[root@root ~]$ i=`awk  BEGIN'{printf  "%.2fn", 9/2 }'` ; echo i=$i;
i=4.50
[root@root ~]$ i=`awk  BEGIN'{  x=9 ; y=4 ; printf  "%.2fn", x/y }'` ; echo i=$i;
i=4.50


运算符类型
按位运算符
~, < <, >>, &, |, ^
$[]表示形式告诉 shell 对方括号中的表达式求值

表达式替换
$[ ] 和 $(())
两种格式功能一样,所有的 shell 的求值都是用整数完成
$[ ] 可以接受不同基数的数字

赋值运算符
=、+=、-=、*=、/=、%=、&=、^=、|=、< <=、>>=

Go to Top