
一个,分开
awk的内置函数split允许您将字符串分离为单词并将它们存储在数组中. 您可以自己定义域分隔符,也可以使用当前的FS(域分隔符)值.
格式:
分割(字符串,数组,字段分隔符)
split(字符串,数组)->如果未提供第三个参数,则awk默认使用当前FS值.
time="12:34:56"
echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'
12 34 56
[root@tian1 zhiping.wang]# cat test.txt
Tom 2012-12-11 car 53000
John 2013-01-13 bike 41000
vivi 2013-01-18 car 42800
Tom 2013-01-20 car 32500
John 2013-01-28 bike 63500
输出一月份每个员工的工资:
cat test.txt | awk '{split($2,a,"-");if(a[2]=01){sum[$1]+=$4}}END{for(i in sum) print sum[i],i}'

第二个substr拦截字符串
将子字符串从起始位置返回到指定的长度;如果未指定长度,则将子字符串从字符串的起始位置返回到字符串的结尾.
格式:
substr(s,p)从p开始返回字符串s的后缀部分
substr(sawk数组长度,p,n)返回字符串s的后缀部分,其长度n从p开始
echo "123" | awk '{print substr($0,1,1)}'
1

awk -F': ''{print substr($ 3,6)}'---->表示从第三个字段的第六个字符开始,一直到设置的分隔符“,”结束
sub($ 3,10,8)----->表示从第三个字段的第十个字段开始awk数组长度,以八个字符结尾
substr($ 3,6)---->表示从第三个字段中的第六个字符开始,一直到结束
三,长度字符串长度
length函数返回不带参数的字符串的长度. 长度函数返回整个记录中的字符数
echo "123" | awk '{print length}'

四个gsub函数
The
gsub函数使所有正则表达式都匹配时进行替换. gsub(正则表达式,替换字符串,目标字符串);称为gsub(r,s,t)
示例: 用def替换文件中所有包含abc的行中的abc,然后输出第一和第三列
awk '$0 ~ /abc/ {gsub("abc", "def", $0); print $1, $3}' test.txt
五个,下一个

在awk中,如果调用了next,则将全部执行next之后的命令,并且此行文本的处理在此处结束,然后读取下一条记录并进行操作

图片
以NR和FNR的典型应用为例:
现在有两种文件格式,如下所示:
#cat account
张三|000001
李四|000002
#cat cdr
000001|10
000001|20
000002|30
000002|15
想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
执行如下代码
#awk -F '|' NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
评论:
当NR = FNR为true时,判断当前正在读取第一个文件帐户,然后使用{a [$ 2] = $ 0; next}循环将帐户文件的每一行存储到数组a中,并使用$ 2的第二个字段作为下标引用.
当NR = FNR为假时,判断当前正在读取第二个文件cdr,然后跳过{a [$ 2] = $ 0; next},然后执行{无条件地为第二个文件cdr的每一行打印a [$ 1]“ |” $ 2},此时变量$ 1是第二个文件的第一个字段,并且在读取第一个文件时,第一个文件$ 2的第二个字段用作数组下标. 因此,您可以在此处使用[$ 1]来引用该数组.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-187437-1.html
要坚决应对美国佬的无耻挑衅行为
把群里的人全部拉来了我够了吧
去追求就是最好的
~