awk02

来源:互联网 发布:java 正则表达式语法 编辑:程序博客网 时间:2024/05/16 09:59

最近学习了AWK的基本操作。以下是我整理的学习笔记。

以grade.txt为测试数据,共7个字段,内容如下

基本的命令行:awk  -(选项) ‘{操作动作}’文件名

*************************************************************

1.

$n显示列,$1表示第一列,$2表示第二列,$0表示所有的列,

print 表示打印:awk ‘{print $0}’grade.txt 打印grade文件的所有列

2.

以下是awk中的一些内置变量和内置函数

2.1

-V 赋值作用,写在引号前

awk -v rest=100 '{ print $1,$7*rest}' grade.txt

申明一个变量rest ,并赋值100,然后打印第一个字段,第七个字段*rest的值

2.2

-F表示FS字段的分隔符,默认为空格

grade2.txt #为分隔符

awk -F "#" '{ print $1, $2,$3}' use-f.txt

用-F设置分隔符

2.3

如果数据中的各列用2个以上的分隔符。比如文件use-f.txt

用|来分别设置多个分隔符

awk -F "##|*%|sq" '{ print $1,$2,$3,$4}' use-f.txt

2.4

FIELDWIDTHS 以空格分隔的字段宽度

awk 'BEGIN{FIELDWIDTHS="3 6 9 12"}{ print $1,$2,$3,$4}' use-f.txt

2.5

FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用

2.6

FNR 当前处理的记录号

awk '{print FNR,$1}' grade.txt 

打印记录号和第一个字段

2.7

IGNORECASE 如果该变量设置为非0值,在进行字符串匹配时忽略大小写

2.8

NF 当前记录中的字段个数

NR  已经读出的记录数

awk '{print NF,NR}' grade.txt

打印记录数和总字段数

2.9

OFS 输出的字段分隔符,默认为空格

输出以#为分隔符的3个字段

awk  'BEGIN{OFS="#"} {print $1,$2,$3}'grade.txt

2.91

ORS

输出的行分隔符

awk  'BEGIN{ORS="*"} {print $1}' grade.txt

RS

输入的行分隔符

3. 字符串函数

3.1

index(st)函数返回目标字符串s中查询字符串t的首位置

awk  '{print $1,index($1,”Tan”)}' grade.txt返回第一个字段中Tan出现的位置

3.2

length函数返回字符s字符长度

awk  '{print $1,length($1)}' grade.txt  显示第一个字段的长度

3.3

substr(3个参数)截取字符串

awk  '{print $1,substr($1,1,2)}' grade.txt从第1个字段的第1个字符开始截取2个字符

3.4

substr(p,n) 截取字符串这种形势是2个参数的,返回字段P的第n个字符开始到字符结尾的所有字符串

awk '{print $1,substr($1,3)}' 显示第一个字段中从第三个字段开始到结尾的所有字符

 

*******************************************************************************

4.

比较操作符

<小于 >大于 ==等于!=不等于 ~匹配正则表达式!~不匹配正则表达式

= += *= /= %= 为赋值操作

|| && 等同于 and or

几个实例

4.1

awk ‘{if (FNR>=2 && FNR<=4){print $0}}’打印出第24

4.2

awk '{if ($4=="yellow") || $7〉30} {print $0}}'grade.txt

打印出第4个字段等于yellow或者第七个字段大于30的记录

4.3

awk ‘{if (FNR %2 != 0) {print $0}}’ grade.txt

隔行打印

******************************************************************************

5.

模式

包括BEGIN END

5.1

BEGIN发生在浏览记录之前。可以处理初始化的代码,用于赋值或者打印头部

awk 'BEGIN{print "Name\tBelt\n*************"}{printf "%-10s %-10s\n", $1,$3}' grade.txt

5.11

也可以在BEGIN模块中定义和初始化变量

awk 'BEGIN{rest =100}{print $1,$7*rest}' grade.txt

5.2

ENDawk还提供了另一个特殊块,叫作END块。awk在处理了输入文件中的所有行之后执行这个块

5.21

END计算最终总和。

awk  '{sumof7=sumof7+$7}END {print sumof7}' grade.txt

计算第七列的总和

5.22

关于数组的一个使用

如果第一列的NAME中有重复的值,现在要统计每个唯一NAME的第七列的总和,使用数组和END来操作

awk ‘{aa[$1]=a[$1]+$7}END{for(k in aa) print k,aa[k]}’grade.txt

awk 'BEGIN{rest=100}{if $7>30 aa[$1]=aa[$1]+$7}END{for(k in aa) print k,aa[k]+100}' grade.txt

5.3

BEGIN和END一起用,首先在BEGIN中定义变量rest,并赋值100,然后先选择第七个字段大于30的记录,在汇总出唯一NAME的第七个字段的总和并加上rest的值

6.

数组

赋值

Array[1]=value

Array[2]=value

也可以用列来赋值

Array[$1]=$1

取值

For(a in array) print a,array[a]

可用来判断array中的唯一值

For(i=1;i<=len;i++) print array[i] len为数组长度

*******************************************************************************

7.

条件语句

前面已经使用到的if语句

格式:

  if表达式

  语句1

  else

语句2

嵌套的if语句

if(表达式1

  {if(表达式2

  语句1

  else

  语句2

  }

  语句3

  else {if(表达式3

  语句4

  else

  语句5

  }

语句6

while语句

  格式为:

  while(表达式)

  语句

do-while语句

  格式为:

  do

  {

  语句

}while(条件判断语句)

for语句

  格式为:

  for(初始表达式;终止条件;步长表达式)

{语句}

awk whiledo-whilefor语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。continue从当前位置跳到循环开始处执行。

原创粉丝点击