linux awk 二维数组,上古神器-AWK中高级实例分享-中

**《上古神器-AWK中高级实例分享-中》**

awk '$1=="sun" {print $0}' fileawk '$1 ~ /sun/ {print $0}' fileawk '$2>40' fileawk 'length($1)>4 && $2>50' fileawk '/^$/{x++}END{print x}' file

I,II 两种方式重点掌握

I> awk '{print}' file

II> cat b.sh

#!/bin/bash

awk '{print $0}' file

III> awk -f b.awk file

cat b.awk: {print}

IV> #!/bin/gawk -f

BEGIN{filename==ARGV[1]}

{print}filename #或者 ARGV[1]

AWK双/单引号There are single quotes around

the awk program so that the shell won’t interpret any of it as special shell characters

避免shell转义带来的干扰

推荐单引号

8e1ef696615ff40c8ee5a3d3e7bad61b.png

案例1#index 简介è Index(s,t) 返回子串t在字符串s中的位置,如果没有指定s,返回0

###案例1:

awk '

BEGIN{

##定义变量x

x="abc def";

##awk中变量直接引用,无需$引用

part=index(x,"b");

##打印从b位置开始后的4个字符-包括b位置

print substr(x,part,4)

}'

结果:

1fb24c7ad3f0e15527d9f6e04134e302.png

案例2#substr简介èSubstr(s,p,n) 返回字符串s中从位置p开始长度为n的子串.如果没有给出n,返回从p开始剩余的字符串

###案例2:

awk '

BEGIN{

##定义变量x

x="1234567";

##打印从第二个字符开始所有字符

part1=substr(x,2);

print part1,"..."

}'

awk '

BEGIN{

x="1234567";

##打印从第二个字符开始,后3个字符

part1=substr(x,2,3);

print part1,"..."

}'

结果:

3a13fb6f83d75bae2b00afd6621ed37d.png

案例3##match(s,r) 测试s是否包含匹配r的字符串

##match中两个系统函数 RESTART和RLENGTH.RSTART 当模式不匹配的时,RSTART为0,而##RLENGTH为-1,当匹配时,RSTART为匹配字符串的位置,RLENGTH为匹配字符串的长度,如上##例子RSTART为5,RLENGTH为4 所以RSTART+RLENGTH为匹配字符串后的第一个字符##串的位置

###案例3:

awk '

BEGIN{

##匹配字数,

match("this is a 1234 test",/[0-9]+/);

#RSTART,RLENGTH为内置变量

#RSTART 为匹配到字符串所有的位置

#RLENGTH 为匹配字符串的长度

print RSTART,RLENGTH

}'

393090440233168eac47172eea2bd223.png替换函数:

Sub(); 只替换一个位置

gsub() 替换所有 g为global意思

Sub(r,s,t) 在字符串t中用s替换正则表达式r的首次匹配,t默认为$0

Gsub(r,s,t) 在字符串t中用字符串s替换和正则表达式r匹配的所有字符串,返回替换的个数,如果没有给出t,默认$0

awk '{gsub(/ /,"\n")}END{ print $0}' abc

awk '{sub(/ /,"|||");print $0}' ../test_tem/c

1c4503d6e8c4c3581255101bd22827c7.png

a0eab147d4cfaa9374ca2acfa11eff45.pngd889d1885bb48d651548f788aa46d522.png从输入中读取另一行.getline函数不仅能读取正常的输入数据流,而且也能处理来自文件和管道的输入

Getline函数类似awk中的next语句,两者都是导致下一个输入行被读取,next语句将控制传递回脚本的顶部,getline函数得到下一行但没有改变脚本的控制。可能 的返回值如下:

1 如果能够读取一行。

0 如果到了文件末尾

-1 如果遇到错误

注意: getline函数被称为一个函数并且返回了一个值,但他的语法类似于一个语句,不能写成getline(),它的语法不请允许有圆括号。

从文件读取

Getline < “data” ###从文件data中读取一行

while (1 < 2){

printf "Enter your Name: "

getline < "-"

print

}

}

Getline获取的值赋值为变量

BEGIN{

printf "Enter your name:"

getline name < "-"

print name

}

Wrong: Name=getline

从管道中读取输入

“who am i”|getline

“date +’%a.,%h%d,%y’”Close() 函数用于关闭打开的文件和管道,

1. 每次只能打开一定数量的管道(后面“约束”的章节有介绍为什么会有约束),close()函数关闭一个使用过的管道(通常是getline返回0或者-1的时候)

例: close(“who”)System() 函数执行一个表达式给出的命令,它的返回为命令的退出状态.脚本等待这个命令完成任务后才继续执行.

例:

BEGIN{

If(system(“mkdir dale”) != 0)

Print “Command Failed”

}

Awk –v comfile=”cup_commands” script - ##-v 可使BEGIN中的参数生效和next语句类似 执行到nextfile时,当前的数据文件被放弃.操作从脚本的顶端开始,并使用下一个文件的第一个记录25778a2865f4edefc88fc630b7da4f5b.pngFunction name(parameter-list) {

}

Parameter-list是逗号分隔变量列表,函数体由一个或者多个语句组成.函数中通常包含一个return语句,用于将控制返回到脚本中调用该函数的位置;它通常用一个表达式来返回一个值,如下所示:

Return expression

实例:

Function insert(STRING,POS,INS){

Before_tmp=substr(STRING,1,POS)

After_tmp=substr(STRING,POS+1)

Return before_tmp INS after_tmp

}

a> 数组简介array[index-expression]

index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。

要遍历数组中的每一个元素,需要使用如下的特殊结构:

for (var in array) { statement1, ... }

其中,var用于引用数组下标,而不是元素值;

seq 10| awk '

{

##定义数据a,行号为索引

a[NR]=$0

}END{

##数据元素提取

for(i in a)

{print i,a[i]}

}'}'

05014bd0990275193c38dfc059335b83.png

seq 10| awk '

{

a[NR]=$0

}END{

##awk下用asort排序,排序的实质是对key求值

b=asort(a);

for(i=1;i<=b;i++)

##打印key,value

{print i,a[i]}

}'

f8f5a272aa2a0fa116eb93a1ba8df000.pngSUBSEP 多维数组分割符

awk '

BEGIN{

##二维数组定义

ay[1,10]="a";

ay[10,2]="b";

}END{

for(k in ay)

##二维数组提取(split)

{split(k,idx,SUBSEP);

print idx[1],idx[2],ay[idx[1],idx[2]];}

}' /dev/null

c499571496ff12fa4c16141801013528.png读取标准输入参数:

ARGV 元素个数ARGC,第一个元素下标是0,最后一个是ARGC-1

ENVIRON

BEGIN{

for (env in ENVIRON)

print env"="ENVIRON[env]

}

Delete acro[acronym]

**《上古神器-AWK中高级实例分享-下》**

*****建议牢固掌握上/中章后再进行下章的学习*****

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

* 为最大限度不影响读者感官: *

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值