文章插图
Awk【Awk】AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一 。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识 。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在套用的awk的来源(ls -l /bin/awk )
基本介绍软体名称:Awk
软体平台:Linux及Unix
软体语言:英语
属性:处理文本的程式语言工具
创始人: Alfred Aho 等
特点AWK是一种优良的文本处理工具 。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一 。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识 。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变数和函式 。它具备了一个完整的语言所应具有的几乎所有精美特性 。实际上 AWK 的确拥有自己的语言:AWK 程式设计语言,三位创建者已将它正式定义为“样式扫描和处理语言” 。它允许您创建简短的程式,这些程式读取输入档案、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能 。最简单地说,AWK 是一种用于处理文本的程式语言工具 。AWK 在很多方面类似于 shell 程式语言,儘管 AWK 具有完全属于其本身的语法 。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex,当然还从 C 语言中获取了一些优秀的思想 。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令 。该实用工具扫描档案中的每一行,查找与命令行中所给定内容相匹配的模式 。如果发现匹配内容,则进行下一个编程步骤 。如果找不到匹配内容,则继续处理下一行 。儘管操作可能会很複杂,但命令的语法始终是:awk '{pattern + action}' 或者 awk 'pattern {action}'其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令 。花括弧 ({}) 不需要在程式中始终出现,但它们用于根据特定的模式对一系列指令进行分组 。gawk 是 AWK 的 GNU 版本 。一般的UNIX作业系统,本身即附有AWK,不同的UNIX作业系统所附的AWK其版本亦不尽相同,若读者所使用的系统上未附有AWK,可通过 anonymous ftp 到下列地方取得:phi./pub/gnuftp/UNIX/gnupreppub/gnu注 解:一种程式语言,因其模式匹配语法而特别有用,通常用于数据检索和数据转换 。一个GNU版本称为Gawk 。调用方式awk提供了适应多种需要的不同解决方案,它们是:一、 awk命令行,你可以象使用普通UNIX命令一样使用awk,在命令行中你也可以使用awk程式设计语言,虽然awk支持多行的录入,但是录入长长的命令行并保证其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题 。当然,你也可以在shell script程式中引用awk命令行甚至awk程式脚本 。二、使用-f选项调用awk程式 。awk允许将一段awk程式写入一个文本档案,然后在awk命令行中用-f选项调用并执行这段程式 。具体的方法我们将在后面的awk语法中讲到 。三、利用命令解释器调用awk程式:利用UNIX支持的命令解释器功能,我们可以将一段awk程式写入文本档案,然后在它的第一行加上:#!/bin/awk -f并赋予这个文本档案以执行的许可权 。这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程式了 。awk脚本文本名 待处理档案语法与其它UNIX命令一样,awk拥有自己的语法:awk [ -F re] [parameter...] ['prog'] [-f progfile]参数说明:-F re:允许awk更改其栏位分隔设定 。parameter: 该参数帮助为不同的变数赋值 。'prog': awk的程式语句段 。这个语句段必须用单括弧:'和'括起,以防被shell解释 。这个程式语句段的标準形式为:'pattern {action}'其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成 。与sed类似,你也可以使用"," 分开两样式以选择某个範围 。关于匹配的细节,你可以参考附录,如果仍不懂的话,找本UNIX书学学grep和sed(本人是在学习sed时掌握匹配技术的) 。action参数总是被大括弧包围,它由一系列awk语句组成,各语句之间用";"分隔 。awk解释它们,并在pattern给定的样式匹配的记录上执行其操作 。与shell类似,你也可以使用“#”作为注释符,它使“#”到行尾的内容成为注释,在解释执行时,它们将被忽略 。你可以省略pattern和 action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行预设的操作——在标準输出上显示 。-f progfile:允许awk调用并执行progfile指定有程式档案 。progfile是一个文本档案,他必须符合awk的语法 。in_file:awk的输入档案,awk允许对多个输入档案进行处理 。值得注意的是awk不修改输入档案 。如果未指定输入档案,awk将接受标準输入,并将结果显示在标準输出上 。awk支持输入输出重定向 。内置变数前面说过,awk处理的工作与资料库的处理方式有相同之处,其相同处之一就是awk支持对记录和栏位的处理,其中对栏位的处理是grep和sed不能实现的,这也是awk优于二者的原因之一 。在awk中,预设的情况下总是将文本档案中的一行视为一个记录,而将一行中的某一部分作为记录中的一个栏位 。为了操作这些不同的栏位,awk借用shell的方法,用1,2,3...这样的方式来顺序地表示行(记录)中的不同栏位 。特殊地,awk用0表示整个行(记录) 。不同的栏位之间是用称作分隔设定的字元分隔开的 。系统默认的分隔设定是空格 。awk允许在命令行中用-F re的形式来改变这个分隔设定 。事实上,awk用一个内置的变数RS来记忆这个分隔设定 。awk中有好几个这样的内置变数,例如,记录分隔设定变数RS、当前工作的记录数NR等等,本文后面的附表列出了全部的内置变数 。这些内置的变数可以在awk程式中引用或修改,例如,你可以利用NR变数在模式匹配中指定工作範围,也可以通过修改记录分隔设定RS让一个特殊字元而不是换行符作为记录的分隔设定 。例:显示文本档案myfile中第七行到第十五行中以字元%分隔的第一栏位,第三栏位和第七栏位:awk -F % 'NR>=7,NR<=15 {print $1 $3 $7}' myfile介绍awk提供了有很多内置变数,如果你经常使用awk处理文本,了解这些内置变数的使用是很有必要的 。下面看一下这些内置变数的详细介绍 。ARGC命令行参数个数(不包括awk的选项和awk的程式内容) 。ARGIND 当前正在处理的ARGV中的档案的索引值(同时处理多个档案时会用到) 。ARGV 命令行参数序列数组,下标从0开始 。CONVFMT 数字转换格式,和C语言中的数字输出格式化类似,默认为"%.6g" 。ENVIRON 当前系统的环境变数 。ERRNO 出错时的错误信息 。FIELDWIDTHS 以空格分隔的栏位宽度,如果指定此变数,awk将会用指定的宽度替换变数FS指定的分隔设定 。看下面的例子:[LinuxSong@test /tmp]$ cat tabcdefasfaabcdefasfaabcdefasfa[LinuxSong@test /tmp]$ awk 'BEGIN {FIELDWIDTHS="2 3 4"}{print $1,$2,$3}' tab cde fasfab cde fasfab cde fasfFILENAME 当前正在处理的档案名称,该变数不能在BEGIN块中使用 。FNR当前处理的记录号 。FS 栏位的分隔设定,默认为空格 。IGNORECASE 如果该变数设定为非0值,在进行字元串匹配时忽略大小写 。NF 当前记录中的栏位个数 。NR 已经读出的记录数 。OFMT 数字的输出格式 。OFS 输出的栏位分隔设定,默认为空格 。ORS 输出的记录分隔设定,默认为新行 。RS 输入记录的分隔设定,默认为新行 。RSTART 被match()函式匹配的字元串的起始位置,如果没有匹配则为0(从1开始) 。RLENGTH 被match()函式匹配的字元串的长度 。SUBSEP数组中多个下标的分隔设定,默认为"\034" 。内置函式awk 之所以成为一种优秀的程式设计语言的原因之一是它吸收了某些优秀的程式设计语言(例如C)语言的许多优点 。这些优点之一就是内置函式的使用,awk定义并支持了一系列的内置函式,由于这些函式的使用,使得awk提供的功能更为完善和强大,例如,awk使用了一系列的字元串处理内置函式(这些函式看起来与C 语言的字元串处理函式相似,其使用方式与C语言中的函式也相差无几),正是由于这些内置函式的使用,使awk处理字元串的功能更加强大 。本文后面的附录中列有一般的awk所提供的内置函式,这些内置函式也许与你的awk版本有些出入,因此,在使用之前,最好参考一下你的系统中的在线上帮助 。内置的字元串函式gsub(r,s)在整个$0中用s代替rgsub(r,s,t)在整个t中用s替代rindex(s,t)返回s中字元串t的第一位置length(s)返回s长度match(s,r)测试s是否包含匹配r的字元串split(s,a,fs)在fs上将s分成序列asprint(fmt,exp)返回经fmt格式化后的expsub(r,s)用$0中最左边最长的子串代替ssubstr(s,p)返回字元串s中从p开始的后缀部分substr(s,p,n)返回字元串s中从p开始长度为n的后缀部分gsub函式有点类似于sed查找和替换 。它允许替换一个字元串或字元为另一个字元串或字元,并以正则表达式的形式执行 。第一个函式作用于记录$0,第二个gsub函式允许指定目标,然而,如果未指定目标,预设为$0 。index(s,t)函式返回目标字元串s中查询字元串t的首位置 。length函式返回字元串s字元长度 。match函式测试字元串s是否包含一个正则表达式r定义的匹配 。split使用域分隔设定fs将字元串s划分为指定序列a 。sprint函式类似于printf函式,返回基本输出格式fmt的结果字元串exp 。sub(r,s)函式将用s替代$0中最左边最长的子串,该子串被r匹配 。substr(s,p)返回字元串s在位置p后的后缀 。substr(s,p,n)同上,并指定子串长度为n 。使用命令行按照顺序,我们应当讲解awk程式设计的内容了,但在讲解之前,我们将用一些例子来对前面的知识进行回顾,这些例子都是在命令行中使用的,由此我们可以知道在命令行中使用awk是多幺的方便 。这样做的原因一方面是为下面的内容作铺垫,另一方面是介绍一些解决简单问题的方法,我们完全没有必要用複杂的方法来解决简单的问题----既然awk提供了较为简单的方法的话 。例:显示文本档案mydoc匹配(含有)字元串"sun"的所有行 。awk '/sun/' mydoc由于显示整个记录(全行)是awk的预设动作,因此可以省略action项 。awk '/sun/' mydoc例:下面是一个较为複杂的匹配的示例:awk '/[Ss]un/,/[Mm]oon/ ' myfile它将显示所有匹配Sun或sun的行与匹配Moon或moon的行之间的行,并显示到标準输出上 。例:下面的示例显示了内置变数和内置函式length()的使用:awk 'length($0)>80 {print NR}' myfile该命令行将显示文本myfile中所有超过80个字元的行号,在这里,用0表示整个记录(行),同时,内置变数NR不使用标誌符'' 。例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd档案,检查其中的passwd栏位(第二栏位)是否为"*",如不为"*",则表示该用户没有设定密码,显示出这些用户名(第一栏位) 。我们可以用如下语句实现:#awk -F : '$2!="*" {printf("%s no password!\n",$1)}' /etc/passwd在这个示例中,passwd档案的栏位分隔设定是“:”,因此,必须用-F:来更改默认的栏位分隔设定,这个示例中也涉及到了内置函式printf的使用 。变数如同其它程式设计语言一样,awk允许在程式语言中设定变数,事实上,提供变数的功能是程式设计语言的基本要求 。awk 提供两种变数,一种是awk内置的变数,这前面我们已经讲过,需要着重指出的是,与后面提到的其它变数不同的是,在awk程式中引用内置变数不需要使用标誌符""(回忆一下前面讲过的NR的使用) 。awk提供的另一种变数是自定义变数 。awk允许用户在awk程式语句中定义并调用自已的变数 。当然这种变数不能与内置变数及其它awk保留字相同,在awk中引用自定义变数必须在它前面加上标誌符"" 。与C语言不同的是,awk中不需要对变数进行初始化,awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型 。当变数类型不确定时,awk默认其为字元串类型 。这里有一个技巧:如果你要让你的 awk程式知道你所使用的变数的明确类型,你应当在在程式中给它赋初值 。在后面的实例中,我们将用到这一技巧 。运算与判断作为一种程式设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同:如+、-、*、/、%等等,同时,awk也支持C语言中类似++、--、+=、-=、=+、=-之类的功能,这给熟悉C语言的使用者编写awk程式带来了极大的方便 。作为对运算功能的一种扩展,awk还提供了一系列内置的运算函式(如log、sqr、cos、sin等等)和一些用于对字元串进行操作(运算)的函式(如length、substr等等) 。这些函式的引用大大的提高了awk的运算功能 。作为对条件转移指令的一部分,关係判断是每种程式设计语言都具备的功能,awk也不例外 。awk 中允许进行多种测试,如常用的==(等于)、!=(不等于)、>(大于)、>=(大于等于)、<=(小于等于)等等,同时,作为样式匹配,还提供了~(匹配于)和!~(不匹配于)判断 。作为对测试的一种扩充,awk也支持用逻辑运算符:!(非)、&&;(与)、||(或)和括弧()进行多重判断,这大大增强了awk的功能 。本文的附录中列出了awk所允许的运算、判断以及操作符的优先权 。流程控制流程控制语句是任何程式设计语言都不能缺少的部分 。任何好的语言都有一些执行流程控制的语句 。awk提供的完备的流程控制语句类似于C语言,这给我们编程带来了极大的方便 。1在awk 中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程式赋予初始状态和在程式结束之后执行一些扫尾的工作 。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行 。因此,通常使用BEGIN来显示变数和预置(初始化)变数,使用END来输出最终结果 。例:累计销售档案xs中的销售金额(假设销售金额在记录的第三栏位):awk>'BEGIN { FS=":";print "统计销售金额";total=0}>{print $3;total=total+$3;} >END {printf "销售金额总计:%.2f",total}' sx(注:>;是shell提供的第二提示符,如要在shell程式awk语句和awk语言中换行,则需在行尾加反斜槓\)在这里,BEGIN预置了内部变数FS(栏位分隔设定)和自定义变数total,同时在扫描之前显示出输出行头 。而END则在扫描完成后列印出总合计 。2awk提供了完备的流程控制语句,其用法与C语言类似 。下面我们一一加以说明:2.1、if...else语句:格式:if(表达式)语句1else语句2格式中"语句1"可以是多个语句,如果你为了方便awk判断也方便你自已阅读,你最好将多个语句用{}括起来 。awk分枝结构允许嵌套,其格式为:if(表达式1){if(表达式2)语句1else语句2}语句3else {if(表达式3)语句4else语句5}语句6当然实际操作过程中你可能不会用到如此複杂的分枝结构,这里只是为了给出其样式罢了 。2.2、while语句格式为:while(表达式)语句2.3、do-while语句格式为:do{语句}while(条件判断语句)2.4、for语句格式为:for(初始表达式;终止条件;步长表达式){语句}在awk 的 while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出 。break 中断当前正在执行的循环并跳到循环外执行下一条语句 。continue从当前位置跳到循环开始处执行 。对于exit的执行有两种情况:当exit语句不在 END中时,任何操作中的exit命令表现得如同到了档案尾,所有模式或操作执行将停止,END模式中的操作被执行 。而出现在END中的exit将导致程式终止 。函式定义和调用用户自己的函式是几乎每个高级语言都具有的功能,awk也不例外,但原始的awk并不提供函式功能,只有在nawk或较新的awk版本中才可以增加函式 。函式的使用包含两部分:函式的定义与函式调用 。其中函式定义又包括要执行的代码(函式本身)和从主程式代码传递到该函式的临时调用 。awk函式的定义方法如下: function 函式名(参数表){函式体}在gawk中允许将function省略为func,但其它版本的awk不允许 。函式名必须是一个合法的标誌符,参数表中可以不提供参数(但在调用函式时函式名后的一对括弧仍然是不可缺少的),也可以提供一个或多个参数 。与C语言相似,awk的参数也是通过值来传递的 。在awk 中调用函式比较简单,其方法与C语言相似,但awk比C语言更为灵活,它不执行参数有效性检查 。换句话说,在你调用函式时,可以列出比函式预计(函式定义中规定)的多或少的参数,多余的参数会被awk所忽略,而不足的参数,awk将它们置为预设值0或空字元串,具体置为何值,将取决于参数的使用方式 。awk函式有两种返回方式:隐式返回和显式返回 。当awk执行到函式的结尾时,它自动地返回到调用程式,这是函式是隐式返回的 。如果需要在结束之前退出函式,可以明确地使用返回语句提前退出 。方法是在函式中使用形如:return 返回值 格式的语句 。例:下面的例子演示了函式的使用 。在这个示例中,定义了一个名为print_header的函式,该函式调用了两个参数FileName和 PageNum,FileName参数传给函式当前使用的档案名称,PageNum参数是当前页的页号 。这个函式的功能是列印(显示)出当前档案的档案名称,和当前页的页号 。完成这个功能后,这个函式将返回下一页的页号 。nawk>'BEGIN{pageno=1;file=FILENAME>pageno=print_header(file,pageno);#调用函式print_header>printf("当前页页号是:%d\n",pageno);>}>#定义函式print_header>function print_header(FileName,PageNum){>printf("%s %d\n",FileName,PageNum); >PageNum++;return PageNUm;>}>}' myfile执行这个程式将显示如下内容:myfile 1当前页页号是:2输入输出1.读取下一条记录:awk的next语句导致awk读取下一个记录并完成模式匹配,然后立即执行相应的操作 。通常它用匹配的模式执行操作中的代码 。next导致这个记录的任何额外匹配模式被忽略 。2.简单地读取一条记录awk 的 getline语句用于简单地读取一条记录 。如果用户有一个数据记录类似两个物理记录,那幺getline将尤其有用 。它完成一般栏位的分离(设定栏位变数0FNRNF NR) 。如果成功则返回1,失败则返回0(到达档案尾) 。如果需简单地读取一个档案,则可以编写以下代码:例:示例getline的使用{while(getline==1){#process the inputted fields }}也可以使getline保存输入数据在一个栏位中,而不是通过使用getline variable的形式处理一般栏位 。当使用这种方式时,NF被置成0,FNR和NR被增值 。用户也可以使用getline"datafile"或printf("hello word!\n">>"datafile"3. 输出记录可以通过print 和 printf 将结果输出:awk '{ print $1,$2 }' file4.输出到一个命令awk中允许用如下方式将结果输出到一个命令:printf("hello word!\n"|"sort-t','"awk与shell script混合编程因为awk可以作为一个shell命令使用,因此awk能与shell批处理程式很好的融合在一起,这给实现awk与shell程式的混合编程提供了可能 。实现混合编程的关键是awk与shell script之间的对话,换言之,就是awk与shell script之间的信息交流:awk从shell script中获取所需的信息(通常是变数的值)、在awk中执行shell命令行、shell script将命令执行的结果送给awk处理以及shell scrit读取awk的执行结果等等 。1.awk读取Shell script程式变数在awk中我们可以通过“'$变数名'”的方式读取sell scrpit程式中的变数 。例:在下面的示例中,我们将读取sell scrpit程式中的变数Name,该变数存放的是文本myfile的撰写者,awk将列印出这个人名 。$cat writename:# @(#)#Name="张三" nawk 'BEGIN {name="'Name'";\ printf("\t%s\t撰写者%s\n",FILENAME,name");}\{...}END{...}' myfile2.将shell命令的执行结果送给awk处理作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:例:示例awk处理shell命令的执行结果$who -u | awk '{printf("%s正在执行%s\n",$2,$1)}'该命令将列印出注册终端正在执行的程式名 。3.shell script程式读awk的执行结果为了实现shell script程式读取awk执行的结果,我们可以採取一些特殊的方法,例如我们可以用变数名=`awk语句`的形式将awk执行的结果存放入一个shell script变数 。当然也可以用管道线的方法将awk执行结果传递给shell script程式处理 。例:作为传送讯息的机制之一,UNIX提供了一个向其所有用户传送讯息的命令wall(意思是write to all写给所有用户),该命令允许向所有工作中的用户(终端)传送讯息 。为此,我们可以通过一段shell批处理程式wall.shell来模拟这一程式(事实上比较老的版本中wall就是一段shell批处理程式:$cat wall.shell:# @(#) wall.shell:传送讯息给每个已注册终端#cat >/tmp/$$#用户录入讯息文本who -u | awk '{print $2}' | while read ttydocat /tmp/$$>$ttydone在这个程式里,awk接受who -u命令的执行结果,该命令列印出所有已注册终端的信息,其中第二个栏位是已注册终端的设备名,因此用awk命令析出该设备名,然后用while read tty语句循环读出这些档案名称到变数(shell script变数)tty中,作为信息传送的终结地址 。4.在awk中执行shell命令行----嵌入函式system()system()是一个不适合字元或数字类型的嵌入函式,该函式的功能是处理作为参数传递给它的字元串 。system对这个参数的处理就是将其作为命令处理,也就是说将其当作命令行一样加以执行 。这使得用户在自己的awk程式需要时可以灵活地执行命令或脚本 。例:下面的程式将使用system嵌入函式列印用户编制好的报表档案,这个档案存放在名为myreport.txt的档案中 。为简约起见,我们只列出了其END部分:END {close("myreport.txt");system("lp myreport.txt");}在这个示例中,我们首先使用close语句关闭了档案myreport.txt档案,然后使用system嵌入函式将myreport.txt送入印表机列印 。命令Awk是一种可以对文本和数据进行处理的程式语言,1977年由Alfred Aho、Peter Weinberger和Brian Kernighan开发而来 。Awk的名字是由三位开发者的姓氏首字母构成 。Awk的各种变形(nawk和gawk等等)几乎支持所有的Linux版本,并且可以简单地从命令行使用 。作为一个强大的命令行工具也意味着awk对于Secure Shell也是有效的 。Awk程式语言用于处理文本档案 。Awk在默认情况下,Awk档案的每一行都被视为一个记录 。然后Awk记录进一步分解成一系列的栏位 。Awk程式就是一系列作用在记录和栏位上的“识别-执行”操作语句 。Awk以顺序方式阅读档案,当回响特定模式时,会提示相关动作 。Awk组合你可以将某些Awk匹配进行组合 。再举个例子,如果你想找到包含字元串“220”的行并列印出档案大小和名称,Awk命令可以如下:awk '/220/ {print $5 " " $9}' rob-list.txt Awk输出如下:220 rob3.data220 rob.data当你使用Awk匹配选项 '/ 目标字元串 /' 时,awk命令将对文本档案的每一行进行字元串匹配 。不难想像,除了列印出来的Awk栏位,其他Awk栏位也有可能包含220字元串 。即使Awk档案大小栏位(第5栏位)中不包含220,Awk匹配结果仍然会显示出来 。将awk投入到实际工作中在一些Awk物联网项目中,需要在平台和应用程式之间移动Awk数据,这时我会用到awk 。例如,我已经将DS18B20数字温度感测器的数据通过Arduino运行,将Awk文本数据通过XBee radios输出到Linux笔记本 。使用cat命令查询USB接口将数据传输到笔记本,然后Awk重定向到一个文本档案 。这些Awk数据代表两个不同的感测器“a001”和“a002”上的每秒温度读数 。我用awk进行独立阅读,并把Awk放在Linux笔记本上kst绘图工具里 。我用下面的awk命令为kst绘图工具準备数据 。awk -F "|" '{print $3","$4}' < rob.data > rob2.dataAwk数据输出现在只有X和Y坐标,中间由一个逗号分开,符合kst显示
- 毕易榕
- 江门东站
- ??????????????????????????????????????????????????? ??????
- 挑逗小狗狗
- 古云中学
- 食己根
- 张爱玲文章 秋雨
- 国小英语阅读理解天天练:三年级
- 台北青山寺
- Microsoft Office 2015