4 0
5 root
6 /root
7 /bin/bash
1 root
2 x
3 0
语法:sprintf(格式字符串,项1,项2,….)
解释:该函数的用法与awk或C语言的输出函数printf()相似,不同的是sprintf()会要求打印出的结果当成一个字符串返回。一般常用sprintf()来改变资料格式。例如:x为一数值,若欲将其变成一个含二位小数的数值,可执行如下指令:
[root@myfreelinux pub]# awk ‘BEGIN{x=2;x=sprintf(“%.2f”,x);print x}’,执行结果是2.00
语法:sub( 比对用的正则表达式,新字符串,原字符串)
解释:sub( )将原字符串中第一个(最左边)符合正则表达式的子字符串替换为新字符串。第二个参数“新字符串”中可用”&”来表示“符合条件的字符串”。承上例,执行下列指令:
[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”[&]“,A);print A}’
a6b12[anan212].456an12
[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”|&|”,A);print A}’
a6b12|anan212|.456an12
[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”",A);print A}’
a6b12.456an12
[root@myfreelinux pub]# awk ‘BEGIN{A=”a6b12anan212.456an12″;sub(/(an)+[0-9]*/,”999″,A);print A}’
a6b12999.456an12
由以上四个例子可以看出,&表示匹配的字符串,对于新字符串,需要用双引号引起来,比如“999”,那么匹配的字符串就会替换成999,而如果双引号内没有任何字符的时候,就是将匹配的字符串给删除。
4.下列程序的功能是先通过键盘接收一个字符串,然后按照字符顺序对串中字符从小到大进行排序,同时删除串中重复出现的字符。个人简介主要参考如下eb-1a移民条件:只要符合下列10个条件之中3个,如果不符合,重点在于第十一条,请仔细斟酌参照第11条。wpe使用方法:执行wpe会有下列几项功能可选择:select game选择目前在记忆体中您想拦截的程式,您只需双击该程式名称即可。
[root@myfreelinux pub]# vi submatch.awk
#!/bin/awk
BEGIN{
data=”p12-p24 p56-p66″;
while(match(data,/[0-9]+/)>0){
print substr(data,RSTART,RLENGTH);#RSTART表示匹配的位置,RLENGTH表示匹配的长度,这一行是打印匹配的数字
sub(/[0-9]+/,”",data);#将匹配的数字用空字符串代替
print data;} #匹配的数字打印后,用空字符串代替,原data字符串内容发生变化
}
执行并查看运行结果如下:
[root@myfreelinux pub]# awk -f submatch.awk
12
p-p24 p56-p66
24
p-p p56-p66
56
p-p p-p66
66
p-p p-p awk ‘ BEGIN { data = “p12-P34 P56-p61″
sub( )中第三个参数(原字符串)如果没有指定,默认是$0。比如可用sub( /[9-0]+/,”digital” ) 表示sub(/[0-9]+/,”digital”, $0 )
语法:gsub(正则表达式,新字符串,原字符串)
解释:这个函数与sub()一样,是进行字符串取代的函数。不同点是gsub()会取代所有合条件的子字符串,而sub函数只会取代同一行中第一个符合条件的字符串,gsub()会返回被取代的子字符串个数。
同样是一个程序,只将sub函数替换为gsub函数,再来看一下执行效果:
[root@myfreelinux pub]# vi submatch.awk
#!/bin/awk
BEGIN{
data=”p12-p24 p56-p66″;
while(match(data,/[0-9]+/)>0){
print substr(data,RSTART,RLENGTH);
gsub(/[0-9]+/,”",data);#其他的都不变,只将sub函数替换为gsub函数,输出结果变化很大
print data;}
}
[root@myfreelinux pub]# awk -f submatch.awk
12
p-p p-p #输出结果只有两行,这就是sub和gsub的不同点
通过上面这个例子,对比一下sub中的例子,就能明显的区分出sub和gsub函数的区别。
语法:substr( 字符串,起始位置 [,长度] )
解释:返回从起始位置起,指定长度的子字符串,如果没有指定长度,则返回起始位置到字符串末尾的子字符串。看下例:
[root@myfreelinux pub]# awk ‘BEGIN{A=”I love todays life”;print substr(A,3);}’
love todays life
[root@tx3 ~]# awk 'begin{print sqrt(3)}'。[root@mos download]# awk 'begin{print environ["path"]。[root@tx3 ~]# awk 'begin{"date"| getline a}{print}end{print a}' cj。
love
注意空格也算字符。

(二)、 数学函数
语法:int(x)
解释:返回x的整数部分,去掉小数。看下例:
[root@myfreelinux pub]# awk ‘BEGIN{a=5.5;b=-5.5;print int(a), int(b);}’ #注意int函数是向零取整,而不是四舍五入
5 -5
语法:sqrt(x)
解释:返回x的平方根。看下例:
[root@myfreelinux pub]# awk ‘BEGIN{a=4;b=-9;print sqrt(a),sqrt(b);}’
awk: warning: sqrt: called with negative argument -9
2 nan
通过上例看以看到,如果是一个负数,比如-9,系统会提示非法参数(negative argument),并输出nan。
语法:exp(x)
解释:将返回e 的x次方。 看下例:
[root@tx3 ~]# awk '{print $2,$1,$3,$4}' awk.txt。[root@tx3 ~]# awk '{if ($2>=80 && $2 <=100) {print $1,"great"} else {print $1, "good"}}' cj。[root@tx3 ~]# awk 'begin{print environ["path"]。
2.71828 7.38906
语法:log(x)
解释:返回x以e为底的对数值。看下例:
[root@myfreelinux pub]# awk ‘BEGIN{print log(2.71828),log(-2);}’
awk: warning: log: received negative argument -2
0.999999 nan
可以看出,和执行sqrt(x)一样,x同样不能是负数,否则提示参数错误,并返回nan值。
语法:sin(x)
解释:x 须以弧度为单位,sin(x)将返回x的sin函数值。
语法:cos(x)
解释:x 须以弧度为单位,cos(x)将返回x的cos函数值
语法:atan2(y,x)
解释:返回y/x 的tan反函数之值,返回值系以弧度为单位。
语法:rand()
解释:返回介于0与1之间的(近似)随机数值,0 <rand()<1。除非自己指定rand()函数起始的,否则每次执行awk程序时,rand()函数都将使用同一个內定的,来产生随机数。
语法:srand([x])
解释:指定以x为rand( )函数起始的。如果省略了x,则awk会以执行时的日期与时间为rand()函数起始的。
awk的内部变量的个数不多,在这里介绍的时候就不按照字母顺序排列了,而是按相关性分类说明。
ARGC
(10)命令的组成 命令 参数 选项 | 参数 选项 | 参数 选项 |。 以下是 php 二进制文件(即 php.exe 程序)提供的命令行模式的选项参数,您随时可以通过 php -h 命令来查询这些参数。我们先来看的是find命令.这个命令对于我们用来查找文件时是相当有用的,但是对于linux新手来说却有一些难于使用,在一定程序是由于他所带的选项,测试,动作类型参数,而且一个参数的执行结果会影响接下来的参数.。
ARGV
ARGV是一个数据,用来记录命令行上的参数的名称。 执行下列命令:
[root@myfreelinux pub]# awk ‘BEGIN{printf(“ARGC=%d/n”,ARGC);for(a in ARGV)printf(“ARGV[%d]=%s/n”,a,ARGV[a]);}’ inte integer
ARGC=3
ARGV[0]=awk
ARGV[1]=inte
ARGV[2]=integer
需要注意当ARGC = 3 时,命令列上只指定了2 个文件。
awk的参数-F/t 表示以tab 为栏位分隔字符FS(field seporator);-v a=8 是用以初始化程序中的变量。
FILENAME
FILENAME用来表示目前正在处理的文件名。
FS域分隔字符
$0 表示目前awk所读入的数据行的内容,$1,$2…示所读入的数据行经过FS指定分割符分割后的第一域,第二域…的记过。
说明:当awk读入一行数据行”A123 8:15″ 时,会先以$0 记录,即$0 = “A123 8:15″,如果程序中进一步使用了$1,$2…或 NF等内部变量时,awk才会自动分割 $0,以便取得各域的数据。切割后各个域的数据会分別用$1,$2,$3…等存储。
awk默认的(default)域分隔字符(FS)为空白字符(空格及tab)。以上例来说,如果没有改变FS的值,那么分割后:第一个域 ($1)=”A123″,第二个域($2)=”8:15″。也可以使用正则表达式来定义FS,比如FS=/[ /t:]+/,表示0或多个空格、tab、:分别或他们三个任意组合成的字符串作为分割符,awk每次需要分割数据行时,就会参考目前FS的值。 那么这定FS后,$0 = “A123 8:15″,将被分割为,第一个域($1) = “A123″,第二个域($2) = “8″,第三个域($3) = “15″。
NR (number record)
NR表示awk 开始执行该程序后所读取的数据行数。
FNR (file number record)
FNR 与NR功用类似;不同的是awk在处理多个数据文件的时候,每打开一个新的文件awk语言,FNR便从0重新累计,而NR是一直累加,看个列子更直观些,见下列:
[root@myfreelinux pub]# cat inte
123
324
[root@myfreelinux pub]# cat integer
222 111
333 111
444 111
[root@myfreelinux pub]# awk ‘BEGIN{print NR,FNR,$0}’ inte integer
0 0
[root@:h ~]# awk ‘{print nr,$0}‘ ngirx.conf。[root@tx3 ~]# awk 'nr==1{print $0}' p1。userparameter=nginx_accepts,curl -s 127.0.0.1/status|awk 'nr==3 {print $1}'。
1 1 123
2 2 324
3 1 222 111
4 2 333 111
5 3
6 4 444 111
NF(number field)
NF表示当前行被域分隔符分割成的域的个数。awk 每读入一笔数据后,在程序中用NF记录该行数据包含的域的个数。在下一行数据被读入之前,NF不会改变。但如果使用$0来记录数据,例如:使用getline,此时NF将代表新的$0上数据的域的个数。
OFS (output file separate)
OFS输出域分隔字符。默认是” “(一个空白)
ORS(output Record separate)
ORS输出数据行分隔字符。默认值是”/n”(换行符)。
OFMT(output format)
OFMT数值数据的输出格式。默认值”%.6g”(若须要时最多印出6位小数)。
A、单域宽输出格式为writeln 在n个字符宽的输出域上按右对齐方式输出i的值,若n大于i的实际位数, 则在i值前面补 双域宽主要用于实型数据的输出。varicad兼容几乎所有的打印输出设备(如各种打印机、绘图仪等,包括postscript输出),可以通过任何windows或kde linux的打印驱动来进行输出,也可以使用varicad内置的打印驱动指令进行输出。的域值加到第一个值后面,之间用逗号分隔,最终能将多个标题域结合成“域名:域值”对。
[root@ubuntu]awk_test:$ awk 'begin{fieldwidths="2 4 4 4"}{print $1"||"$2"||"$3"||"$4}' awk_test.txt 。[root@mos download]# awk -v ofs=9 '{print $1,$nf}' demo.txt。[root@mos download]# awk -v ofs=\" '{print $1,$nf}' demo.txt。
0.666667
0.67:1
程序中通过改变OFS和OFMT的值,改变了指令print的输出格式。
RS
RS( Record Separator) :awk从文件上读取数据时,将根据RS的定义把数据切割成许多Records,awk一次只读入一个Record进行处理。RS 的默认值是换行符”/n”,所以一般awk一次仅读入一行数据。有时一个Record含括了几行数据(Multi-line Record),这情況下不能再以”/n” 来分隔相邻的Records,可改用空白行来分隔,即令RS = “”,表示以空白行来分隔相邻的Records。
RSTART
RSTART与使用字串函数match( )有关的变量,是匹配的字符的开始的位置。
RLENGTH
RLENGTH与使用字串函数match( )有关的变量,RLENGTH是匹配的字符串的长度。当使用match() 函数后,awk会将match() 执行的结果以RSTART和RLENGTH记录。看下面的例子:
print rstart, rlength。 print rstart,rlength}' 。 print rstart,rlength}'3 3。
2 2
[root@myfreelinux pub]# awk ‘BEGIN{match(“banana”,/(an)+/);print RSTART,RLENGTH}’
2 4
[root@myfreelinux pub]# awk ‘BEGIN{match(“banana”,/(na)+/);print RSTART,RLENGTH;}’
3 4
SUBSEP
SUBSEP(Subscript Separator) 数组下标的分隔字符,默认值为”/034″实际上,awk中的数组只接受字串当它的下标,比如: Arr["John"]。但awk中仍然可使用数字当数组的下标,甚至可使用多维的数组(Multi-dimenisional Array),比 如:Arr[2,20]。事实上,awk在接受Arr[2,20]之前,就已先把其下标转换成字串”2/03420″,之后便以Arr["2 /03420"] 代替Arr[2,20]。可参考下例:
[root@myfreelinux pub]# awk ‘BEGIN{arr[2,20]=13;print arr[2,20];print arr["2/03420"];idx=2 SUBSEP 20;print arr[idx];}’
13
13
13
再看下面这个例子,统计每门课有几个学生选修,用课程名称作为数组的下标:
[root@myfreelinux pub]# cat kecheng.dat
zhangsan math english chinese
lisi computer chinese english
wangwudianzi chinese math
zhaoliu huanjing english chinese
[root@myfreelinux pub]# cat kecheng.awk
#!/bin/awk -f
{
for(i=2;i<=NF;i++)
array[$i]++;
}
END{
for(one_array in array)
print one_array,array[one_array];
}
awk -f reformat2.awk arr.dat。$awk -f pay2.awk emp.dat。$ awk -f pay1.awk emp.dat。
computer 1
english 3
dianzi 1
chinese 4
math 2
huanjing 1
为什么要使用正则表达式
linux/UNIX中提供了许多命令和工具,它们可以在文件中查找(Search)字符串或替换(Replace)字符串的功能。像 grep,vi,sed,awk等,不论是查找字符串还是替换字符串,都得先告诉这些命令所要查找(被替换)的字符串是什么,如果未能事先明确知道所要查 找(被替换)的字符串是什么,只知道这个字符串存在的范围或特征时,例如:(一)查找”T0.c”,”T1.c”,”T2.c”…”T9.c” 当中的任一字符串。(二)查找至少存在一个”A”的任意字符串。这种情況下,如何告诉执行查找字符串的命令所要查找的字符串是什么。例(一) 中,要查找任一在”T”与”.c” 之间存在一个阿拉伯数字的字符串;当然可以用列举的方式,一一把所要查找的字符串告诉执行命令的命令。但例(二) 中符合该条件的字符串有无限种可能,势必无法一一列举。此时,便需要另一种字符串表示的方法。
什么是正则表达式:正则表达式(以下简称Regexp)是一种字符串表达的方式。可以指定具有某特征的所有字符串。
注:为了与一般字符串区别,在这里,在正则表达式的字符串之前皆加 “Regexp”。
awk程序中常以/…/括住Regexp,以区別于一般字符串。
组成正则表达式的元素:普通字符除了 . * [ ] + ? ( ) / ^ $ 外的所有字符。由普通字符所组成的Regexp的意义与原字符串字面意义相同。例如:Regexp “the” 与一般字符串的”the” 代表相同的意义。
(Meta character) :用来代表任意一字符。在linux/unix Shell中使用 “*”表示0个或任意长度的字符。
在Regexp中:
“.” 代表任意一个字符
“*” 另有其它涵意,并不代表任意长度的字符串
^ 表示该字符串必须出现于行首
$ 表示该字符串必须出现于行末。
13行报错,就是赋值那行,报错原因是“字符分配的类型是不兼容的类型”我们看看这句n.name = “qiang”,右边是字符串常量,这里其实是字符串的首地址,就是一个地址,我们以前 char a[] = “qiang”没错啊,为什么这里报错了,我们看看左值,n.name, name 是数组名,是代表数组的首地址啊,但是我们要记住,这里name是个地址常量,是不能给常量赋值的,所以会报错,那我们如何给一个结构体中的字符数组赋值呢。7、the following c++ code tries to count occurence of each asciicharcater in given string and finally print out the occurrencynumbers:(下面c++代码用来统计每个ascii字符的出现次数,最后给出出现数值)。有多种方式表示文件中的信息,若用0,1码表示字符的方法,即每个字符用唯一的一个0,1串表示。
利用mid函数,返回文本串中从指定位置开始的特定数目的字符,该数目由用户指定。如果想要更加的有意义,那也可以选择定制钻戒,在戒指上刻上彼此的代号或是有特殊意义的字符,相信送给老婆一定会很惊喜和感动的。23.仅从两串含有相等的字符,不能判定两串是否相等,两串相等的充分必要条件是两串长度相等且对应位置上的字符相同(即两串串值相等)。
[...]字符集合,用来表示两中括号间所有的字符当中的任一个。
例如:Regexp/[Tt]/可用来表示字符”T” 或 “t”。所以Regexp/[Tt]he/,表示字符串”The” 或 “the”。字符集合[...] 內不可随意留空白。例如:Regexp/[ Tt ]/,其中括号內有空白字符,除表示”T”,”t” 中任一个字符,也可代表一个” “(空白字符) 。
元字符既可以是放在 [] 中的任意单个字符(如 [a] 表示匹配单个小写字符 a ),也可以是字符序列(如 [a-d] 表示匹配 a 、 b 、 c 、 d 之间的任意一个字符,而 \w 表示任意英文字母和数字及下划线),下面是一些常见的元字符:。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。regular expression中使用中括号[ ... ]表示一个字符集合,用以表示任意一个位于两中括号间的字符.故可用"[ \t:]"表示一个空白, tab或":"。
中括号[]: 中括号用来表示一个字符集合,如果这个集合有很多元素,如26个字母,数字等,一个个地写在中括号里,未免太麻烦了,所以一般我们用连字符来表示一个范围(例如:[a-z]表示小写字母的集合。表示一个字符集合,用以表示任意一个位于两中括号间的字符.故可用"[\t:]"表示。regular expression中使用中括号[ ... ]表示一个字符集合,用以表示任意一个位于两中括号间的字符.故可用"[ \t:]"表示一个空白, tab或":"。
在正则表达式中,元字符(metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,如:、 \w等。注意:这里使用的模式以[[开头、以]]结束,这是使用posix字符类所必须的,posix字符必须括在[:和:]之间,外层[和]字符用来定义一个集合,内层的[和]字符是posix字符类本身的组成部分。2、定位字符所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。
* 表示字符重复次数的特殊字符。”*” 表示它前方之字符可出现0次或任意多次,即字符大于等于0次。例如:Regexp/T[0-9]*/.c/中,*表示其前[0-9](一个阿拉伯数字)出现的次数可为0次或多次。所以Regexp /T[0-9]*/.c/可用来表示”T.c”,”T0.c”,”T1.c”…”T19.c” 。
{数字,}:表示之前的元素需要出现至少数字次{数字1,数字1}:表示之前的元素出现次数不少于在数字1且不大于数字2[一些字符]:表示一个在一些字符内的字符,一些字符部分可以用-进行简记,例如[abcde]等同于[a-e]。a.前2位 b.前3位 c.前4位3.17位的vin码中的车辆说明部分(vds)用来说明车辆的一般特征,由vin码的( c )字符组成。 字符0~9这10个数字字符的高3位编码(d6d5d4)为011,低4位为0000~1011。
{数字,}:表示之前的元素需要出现至少数字次{数字1,数字1}:表示之前的元素出现次数不少于在数字1且不大于数字2[一些字符]:表示一个在一些字符内的字符,一些字符部分可以用-进行简记,例如[abcde]等同于[a-e]。车辆所有人不是个人的,明号码为车辆所有人的组织机构代码证号,需要输入组织机构代码证号的前6位,前6位中如出现非数字字符的,请用半角“。 //号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符x。
(…)用来括住一群字符,且把他当成一个group。例如:Regexp /12+/ 表示字符串”12″,”122″,”1222″,”12222″,…。egexp /(12)+/ 表示字符串 “12″,”1212″,”121212″,”12121212″…。上式中12 以( )括住,所以”+” 所表示的是12,重复出现的也是12。
| 表示逻辑上的”或”(or)。例如:Regexp/ Oranges?|apples?|water/可用来表示:字符串 “Orange”,”Oranges” 或 “apple”,”apples” 或 “water” 。
match是什么? 讨论Regexp时,经常遇到”某字符串匹配( match )某Regexp”的字眼。意思是: “这个Regexp可被解释成该字符串”。[ 例如] : 字符串”the” 匹配(match) Regexp /[Tt]he/。因为 Regexp /[Tt]he/ 可解释成字符串 “the” 或 “The”,故字符串 “the” 或 “The”都匹配(match) Regexp /[Th]he/。
awk 中提供二个关系运算符(Relational Operator):~,!~,它们也称之为match,not match。但函义与一般常说的match略有不同。其定义如下:A 表一字符串,B 表一Regular Expression,只要A 字符串中存在有子字符串可match( 一般定义的 match) Regexp B ,则A ~B 就算成立,其值为true,反之则为false。! ~ 的定义与~恰好相反。例如:”another” 中含有子字符串 “the” 可match Regexp /[Tt]he/,所以 “another” ~ /[Tt]he/之值为 true
有些地方不把( ~,!~)与Relational Operators 归为一类。
应用Regular Expression 解题的简例:下面列出一些应用Regular Expression 的简例
例1:将文件中所有的字符串 “Regular Expression” 或 “Regular expression” 换成 “Regexp”
[root@myfreelinux pub]# cat regexp
Regular expression
Regular Expression
awk---grep---sed [root@book class]# df -k | awk '{print $1}' | grep -v 'none' | sed s"/\/dev\///g"。[root@book class]# df -k | awk ‘{print $1}’ | grep -v ’none’ | sed s"/。[root@tx3 ~]# awk 'begin{"date"| getline a}{print}end{print a}' cj。
Regexp
Regexp
例2:去除文件中的空白行(或仅含空白字符或tab 的行)
[root@myfreelinux pub]# cat regexp
Regular expression
Regular Expression
[root@myfreelinux pub]# awk ‘{if($0!~/^[ /t]+$/) print $0;}’ regexp
Regular expression
Regular Expression
例3:在文件中具有ddd-dddd (电话号码型态,d 表digital)的字符串前加上”TEL :
[root@myfreelinux pub]# cat regexp
83786550
83786450
[root@myfreelinux pub]# awk ‘{gsub(/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/,”TEL: &”);print $0;}’ regexp
TEL: 83786550
TEL: 83786450
例4:从文件的Fullname 中分离出路径与文件名
print "find :" substr( buffer,rstart, rlength)。awk -f ':' 'begin{print "line col user"}{print nr,nf,$1}end{print filename}' passwd。# /usr/local/apache2/bin/apachectl start。
/usr/local/apache2/bin/apachectl
/usr/local/apache2/bin
apachectl
例5:将某一数值改以表示法表示(整数部分每三位加一撇,且含二位小数)
$ awk 'begin { while("cat statement.txt" | getline) print $0,nf}'statement 1delete 1exit 1next 1。[root@tx3 ~]# awk 'begin{print environ["path"]。while( match(number,/[0-9][0-9][0-9][0-9]/ ) )。
结果输出 ¥1,234,567,890.00
例6: 把文件中所有具”program数字.f”形态的字符串改为”[Ref :program数字.c]”
[root@myfreelinux pub]# cat program
program1.f

program2.f
program34.f
program67.f
[root@myfreelinux pub]# awk ‘{while(match($0,/program[0-9]+/.f/)){replace=”[Ref: "substr($0,RSTART,RLENGTH-2)".c]“; sub(/program[0-9]+/.f/,replace);} print $0}’ program
[Ref: program1.c]
[Ref: program2.c]
[Ref: program34.c]
[Ref: program67.c]
12.replace 用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配。其实需要使用函数stgeomfromtext()来格式化被定义的数据按照ogc标准输出wkt格式的空间数据结果,也可使用函数stmpointfromtext()代替stgeomfromtext()的使用,通过如下sql命令可定义一个点集合对象实例,并使用函数stgeometryn()输出空间数据结果:。 例 普通函数就是函数对象 重载了“ ”运算符的类的实例是函数对象 * 函数对象 例10-13、例10-14 使用两种方式定义表示乘法的函数对象 通过定义普通函数(例10-13) 通过重载类的“ ”运算符(例10-14) 用到以下算法: template class inputiterator, class type, class binaryfunction type accumulate inputiterator first, inputiterator last, type val, binaryfunction binaryop 。
如果文件a中包含文件b,则将文件b的记录打印出来输出到c文件里
文件a:
10/05766798607,11/20050325191329,29/0.1,14/05766798607
10/05767158557,11/20050325191329,29/0.08,14/05767158557
文件b:
05766798607
05766798608
05766798609
通过文件a和文件b对比,导出这样的文件出来.
10/05766798607,11/20050325191329,29/0.1,14/05766798607
本人查了很多网上的答案都是错误码的
正确答案应该:
方法一: awk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{if ($2 in a)print $0}' b a >c
base_ver=`svn log -r base | awk '{if(nr==2)print $1}' | cut -b 2-`。[root@tx3 ~]# awk '{ if ($2 >= 90 && $2 <= 100) {print $1,"a"} else if ($2 >= 80 && $2 < 90) {print $1,"b"} else if ($2 >= 70 && $2 < 80) {print $1,"c"} else if ($2 >= 60 && $2 < 70) {print $1,"d"} else {print $1,"e"} }' cj。netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -f: '{print $1}'|sort|uniq -c|sort -nr|head -n20 | netstat -ant |awk '/:80/{split($5,ip,":")。
这两种方法是用数组处理的,速度比较快,处理9万行只需4秒。
还有一种方法是通过while 每次用read命令从b中读一条记录与a中$2比较如果相等则输出到c中
root@TestAs4zlwt]# more for3.sh
#!/bin/bash
while read line ; do
awk -F'[/,]' '$2 == '$line' {print $0}' a >>c
done < b;
这种方法很好理解,但速度非常慢,每次只读取一条记录,9万行需5个小时处理。
例二awk数组处理两个文件索引的问题(替代法)
[root@TestAs4 zlwt]# more a
deptA
deptB
deptC
deptD
[root@TestAs4 zlwt]# more b
aaa 0
bbb 1
ccc 2
ddd 0
eee 2
fff 2
[root@tx3 ~]# awk 'nr==1{print $0}' p1。ifconfig eth0|awk ‘nr==2‘|awk -f "[ :]+" ‘{print $4}‘。[root@:h ~]# awk ‘{print nr,$0}‘ ngirx.conf。
aaa deptA
bbb deptB
ccc deptC
ddd deptA
eee deptC
fff deptC
NR==FNR {k[i++]=$1}#先把a文件的值赋给数组k,下标从0自动增长
NR>FNR { print $1,k[$2] #其中$1,$2是b中的第一,二个域,k[$2]为a的值
下面方法是r2007版主的其实是一样的
[root@tx3 ~]# awk '{ if ($2 >= 90 && $2 <= 100) {print $1,"a"} else if ($2 >= 80 && $2 < 90) {print $1,"b"} else if ($2 >= 70 && $2 < 80) {print $1,"c"} else if ($2 >= 60 && $2 < 70) {print $1,"d"} else {print $1,"e"} }' cj。awk ‘{if($0~/^$/)print nr}’ file。cat -n 13.log|awk '{if(nr==1)print $0}'。
aaa deptA
bbb deptB
ccc deptC
ddd deptA
eee deptC
fff deptC
另外一个例子
awk' BEGIN{FS="[|]";OFS="|"}
FNR==NR{a[$1]=$2}
FNR<NR{if(!a[$1]) {$1="13";print}
else {$1=a[$1];print}}
' wj wj1>wj2
文件1
1|name1
2|name2
3|name3
5|name5
6|name6
文件2
1|name11
2|name22
3|name33
4|name44
5|name55
6|name66
7|name77
8|name88
输出结果
name1|name11
name2|name22
name3|name33
13|name44
name5|name55
name6|name66
13|name77
13|name88
它在处理2个以|分割的文件
例如
文件1 wj 格式
id1|desc1
文件2 wj1格式
id2|desc2
FNR==NR{a[$1]=$2} 意思是处理第一个文件时 把 desc1 赋值给 数组 a 的 a[id1] 单元。
FNR<NR 条件是在处理第2文件成立。这样在处理第2 文件时
{if(!a[$1]) {$1="13";print}
else {$1=a[$1];print
如果a[$1] 是空,就把第2文件那行的第1列替换为 13 输出 如: 13|desc2
如果a[$1]非空,就是这个数组值已经在处理第1文件赋过值。就把$1替换为 a[$1] 即 文件1对应的$2。输出的就是 desc1|desc2
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-114808-4.html
他们要来就来吧