Ubuntu awk的字段变量内建变量

系统 Linux
Ubuntu awk 所内建的字段变量及其涵意如下 : 字段变量含义$0一字符串, 其内容为目前 Ubuntu awk 所读入的数据行.$1$0 上第一个字段的数据.$2$0 上第二个字段的数据.读入数据行时, Ubuntu awk如何更新(update)这些内建的字段变量?

给大家推荐一款很不错的Ubuntu awk系统很有学习价值,这里我主要讲解Ubuntu awk系统的应用,包括介绍Ubuntu awk知识等方面。如何执行Ubuntu awk 于UNIX的命令行上键入诸如下列格式的指令: ( "$"表Shell命令行上的提示符号) $Ubuntu awk 'Ubuntu awk程序' 数据文件文件名 则Ubuntu awk会先编译该程序, 然后执行该程序来处理所指定的数据文件.

(上列方式系直接把程序写在UNIX的命令行上)

Ubuntu awk程序的主要结构: Ubuntu awk程序中主要语法是 Pattern { Actions}, 故常见之Ubuntu awk 程序其型态如下 :

  1. Pattern1 { Actions1 }   
  2. Pattern2 { Actions2 }   
  3. Pattern3 { Actions3 }  

Pattern 是什么 ? Ubuntu awk 可接受许多不同型态的 Pattern. 一般常使用 "关系表达式"(Relational expression) 来当成 Pattern.

例如:
x > 34 是一个Pattern, 判断变量 x 与 34 是否存在大于的关系. x == y 是一个Pattern, 判断变量 x 与变量 y 是否存在等于的关系. 上式中 x >34 , x == y 便是典型的Pattern. Ubuntu awk 提供 C 语言中常见的关系运算符(Relational Operators) 如 此外, Ubuntu awk 还提供 ~ (match) 及 !~(not match) 二个关系运算符(注一).

其用法与涵义如下:
若 A 为一字符串, B 为一正则表达式(Regular Expression)A ~ B 判断 字符串A 中是否 包含 能匹配(match)B表达式的子字符串. A !~ B 判断 字符串A 中是否 不包含 能匹配(match)B表达式的子字符串.

例如 :
"banana" ~ /an/ 整个是一个Pattern. 因为"banana"中含有可以匹配 /an/ 的子字符串, 故此关系式成立(true),整个Pattern的值也是true. 相关细节请参考 附录 A Patterns, 附录 E Regular Expression (注一:) 有少数Ubuntu awk论著, 把 ~, !~ 当成另一类的 Operator,并不视为一种 Relational Operator. 本手册中将这两个运算符当成一种 Relational Operator.

Actions 是什么?

Actions 是由许多Ubuntu awk指令构成. 而Ubuntu awk的指令与 C 语言中的指令十分类似.

例如 :
Ubuntu awk的 I/O指令 : print, printf( ), getline...Ubuntu awk的 流程控制指令 : if(...){..} else{..}, while(...){...}... (请参考 附录 B --- "Actions" ) Ubuntu awk 如何处理 Pattern { Actions } ? Ubuntu awk 会先判断(Evaluate) 该 Pattern 的值, 若 Pattern 判断后的值为true (或不为0的数字,或不是空的字符串), 则 Ubuntu awk将执行该 Pattern 所对应的 Actions.反之, 若 Pattern 之值不为 true, 则Ubuntu awk将不执行该 Pattern所对应的 Actions.

例如 : 若Ubuntu awk程序中有下列两指令
50 > 23 {print "Hello! The word!!" } "banana" ~ /123/ { print "Good morning !" } Ubuntu awk会先判断 50 >23 是否成立. 因为该式成立, 所以Ubuntu awk将印出"Hello! The word!!". 而另一 Pattern 为 "banana" ~/123/.

 因为"banana" 内未含有任何子字符串可 match /123/, 该 Pattern 之值为false, 故Ubuntu awk将不会印出 "Good morning !"
Ubuntu awk 如何处理{ Actions } 的语法?(缺少Pattern部分) 有时语法 Pattern { Actions }中, Pattern 部分被省略,只剩 {Actions}.这种情形表示 "无条件执行这个 Actions".

Ubuntu awk 的字段变量

Ubuntu awk 所内建的字段变量及其涵意如下 : 字段变量含义$0一字符串, 其内容为目前 Ubuntu awk 所读入的数据行.$1$0 上第一个字段的数据.$2$0 上第二个字段的数据.读入数据行时, Ubuntu awk如何更新(update)这些内建的字段变量?

当 Ubuntu awk 从数据文件中读取一个数据行时, Ubuntu awk 会使用内建变量$0 予以记录.每当 $0 被改动时 (例如 : 读入新的数据行 或 自行变更 $0,...) Ubuntu awk 会立刻重新分析 $0 的字段情况, 并将 $0 上各字段的数据用 $1, $2, ..予以记录.

Ubuntu awk的内建变量(Built-in Variables)

Ubuntu awk 提供了许多内建变量, 使用者于程序中可使用这些变量来取得相关信息.常见的内建变量有 :

内建变量含义
 
NF (Number of Fields)为一整数, 其值表$0上所存在的字段数目.NR (Number of Records)为一整数, 其值表Ubuntu awk已读入的数据行数目.FILENAMEUbuntu awk正在处理的数据文件文件名.
 
例如 : Ubuntu awk 从资料文件 emp.dat 中读入第一笔数据行 "A125 Jenny 100 210" 之后, 程序中:

  1. $0 之值将是 "A125 Jenny 100 210"   
  2. $1 之值为 "A125"   
  3. $2 之值为 "Jenny"   
  4. $3 之值为 100   
  5. $4 之值为 210   
  6. $NF 之值为 4   
  7. $NR 之值为 1   
  8. $FILENAME 之值为 "emp.dat"  

Ubuntu awk的工作流程 :

执行Ubuntu awk时, 它会反复进行下列四步骤. 自动从指定的数据文件中读取一个数据行. 自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0... 依次执行程序中 所有 的 Pattern { Actions } 指令.

当执行完程序中所有 Pattern { Actions } 时, 若数据文件中还有未读取的数据, 则反复执行步骤1到步骤4. Ubuntu awk会自动重复进行上述4个步骤, 使用者不须于程序中编写这个循环 (Loop).

打印文件中指定的字段数据并加以计算Ubuntu awk 处理数据时, 它会自动从数据文件中一次读取一笔记录, 并会 将该数据切分成一个个的字段; 程序中可使用 $1, $2,... 直接取得 各个字段的内容. 这个特色让使用者易于用 Ubuntu awk 编写 reformatter 来改变量据格式.

[ 范例 :] 以文件 emp.dat 为例, 计算每人应发工资并打印报表. [ 分析 :] Ubuntu awk 会自行一次读入一列数据, 故程序中仅需告诉 Ubuntu awk 如何处理所读入的数据行. 执行如下命令 : ( $ 表UNIX命令行上的提示符 ) $ Ubuntu awk '{ print $2, $3 * $4 }' emp.dat

执行结果如下 : 屏幕出现 :

  1. Jenny 21000   
  2. Dan 23650   
  3. Max 27170   
  4. John 27500   
  5. Linda 19950  

[ 说明 :] UNIX命令行上, 执行Ubuntu awk的语法为: $Ubuntu awk 'Ubuntu awk程序' 欲处理的资料文件文件名本范例中的 程序部分 为 {print $2, $3 * $4}. 把程序置于命令行时, 程序之前后须以 ' 括住. emp.dat 为指定给该程序处理的数据文件文件名.

本程序中使用 : Pattern { Actions } 语法.

Pattern 部分被省略, 表无任何限制条件. 故Ubuntu awk读入每笔数据行后都将无条件执行这个 Actions. print为Ubuntu awk所提供的输出指令, 会将数据输出到stdout(屏幕). print 的参数间彼此以 "," (逗号) 隔开, 印出数据时彼此间会以空白隔开. (参考 附录 D 内建变量OFS) 将上述的 程序部分 储存于文件 pay1.Ubuntu awk 中. 执行命令时再指定Ubuntu awk程序文件 之文件名. 这是执行Ubuntu awk的另一种方式, 特别适用于程序较大的情况, 其语法如下:

  1. $ Ubuntu awk -f Ubuntu awk程序文件名 数据文件文件名 故执行下列两命令,将产生同样的结果.   
  2. $ Ubuntu awk -f pay1.Ubuntu awk emp.dat   
  3. $ Ubuntu awk '{ print $2, $3 * $4 }' emp.dat  

读者可使用 "-f" 参数,让Ubuntu awk主程序使用“其它仅含 Ubuntu awk函数 的文件中的函数 ”

其语法如下:

$ Ubuntu awk -f Ubuntu awk主程序文件名 -f Ubuntu awk函数文件名 数据文件文件名 (有关 Ubuntu awk 中函数的声明与使用于 7.4 中说明) Ubuntu awk中也提供与 C 语言中类似用法的 printf() 函数. 使用该函数可进一步控制数据的输出格式. 编辑另一个Ubuntu awk程序如下, 并取名为 pay2.Ubuntu awk { printf("%6s Work hours: %3d Pay: %5d"n", $2,$3, $3* $4) }

执行下列命令 $Ubuntu awk -f pay2.Ubuntu awk emp.dat 执行结果屏幕出现:

  1. Jenny Work hours: 100 Pay: 21000   
  2. Dan Work hours: 110 Pay: 23650   
  3. Max Work hours: 130 Pay: 27170   
  4. John Work hours: 125 Pay: 27500   
  5. Linda Work hours:  95 Pay: 19950  

【编辑推荐】

  1. Ubuntu awk概述内建有pipe的功能
  2. Ubuntu操作系统vim基本使用
  3. Ubuntu AutoIndex一般在编译时已经安装好
  4. Ubuntu MySQL设置同步服务器
  5. Ubuntu mysql配置设置过程
责任编辑:佚名 来源: CSDN博客
相关推荐

2019-11-26 14:00:58

awkLinux命令

2010-03-04 15:03:26

Ubuntu awk

2016-08-10 16:07:08

awkLinux开源

2016-08-11 09:18:33

awkShellLinux

2017-08-04 14:00:32

Linuxawk变量

2010-09-10 09:47:14

SQL变量指示

2010-02-22 15:04:53

Ubuntu 7.04

2021-03-25 12:00:18

Python变量常量

2011-06-02 14:25:45

静态变量

2013-05-09 02:38:27

2010-03-04 15:28:01

Ubuntu Shel

2015-01-07 14:41:32

Android全局变量局部变量

2011-07-11 16:13:01

Java静态变量实例变量

2024-05-29 08:49:22

Python全局变量局部变量

2010-07-13 09:34:24

Perl纯变量

2010-11-26 14:20:28

MySQL系统变量

2010-09-08 17:29:37

SQL表变量

2009-07-21 16:58:31

Scala变量范围

2010-11-26 14:39:35

MySQL用户变量

2021-03-28 23:37:35

线程专属变量
点赞
收藏

51CTO技术栈公众号