尚观第15周AWK学习笔记

一 编写awk 脚本

HELLO,WORLD

$echo 'this line of data is ignored' > test

$ awk'{ print "Hello, world" }' test

Hello,world

Awk读入一行,执行一次括号里面的动作

$ cattest2

Hello,world

$ awk'{ print }' test2

Hello,world

print语句没有参数,只简单输出每个输入行。

$ awk‘BEGIN {print “hello,World”}’

Hello,World

BEGIN模式不需要等待输入,它在第一个输入行读入之前执行。

awk 程序设计模型

awk 程序由所谓的主输入(main input)循环组成。一个循环称作一个例程。

awk允许你编写两个特殊的例程,他们在任何输入被读取前和所有输入都被读

取后执行。他们是与BEGIN和END规则相关的过程。BEGIN和END过程是可

选的。

模式匹配 src1.awk

#test for integer, string or empty line.

/[0-9]+/{ print "That is an integer" }

/[A-Za-z]+/{ print "This is a string" }

/^$/{ print "This is a blank line." }

一个特殊的例子:

$ awk-f awksrc

4T

Thatis an integer

Thisis a string

一行可以匹配一条或多条规则

程序脚本的注释

# 以#号开始的一行

记录和字段

awk假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入

行作为一条记录,而将由空格或制表符分隔的单词作为字段。连续的多个空格

和/或制表符被作为一个分隔符。

JohnRobinson 666-555-1111

字段的引用和分离

awk允许使用字段操作符$来指定字段。$后面可以跟着一个数字或者一个变量。

$1表示第一个字段,$2表示第二个字段,$0表示整个输入记录。

$ awk'{ print $2, $1, $3 }' names

RobinsonJohn 666-555-1111

可以使用计算值为整数的表达式来表示一个字段

$echo a b c d | awk 'BEGIN { one = 1; two = 2 }

>{ print $(one + two) }'

c

可以使用-F来改变字段分隔符

$ awk-F"\t" '{ print $2 }' names

666-555-1111

$ awk-F"\t+" '{ print $2 }' names

$ awk-F"[‘:\t]"'{ print $2 }' names

任何3个字符之一都可以被解释为字段分隔符

也可以在脚本中指定域分隔符,通过系统变量FS来改变

BEGIN{ FS = "," } # comma-delimited fields

{print $1 "-" $2 }

使用匹配规则

/MA/{ print $1 ", " $6 }

为了避免假警报,可以使用更精确的匹配

$5 ~/MA/ { print $1 ", " $6 }

还可以使用!来反转这个规则的意义

$5 !~/MA/ { print $1 ", " $6 }

表达式:

常量

分成两种:字符串型和数字型

字符串型在表达式中必须用引号括起来

字符串中可以使用转义序列,常用的转义序列有:

\n 换行 \t 水平制表符 \r 回车

变量

x=1

x是变量的名字 =是一个赋值操作符 1是一个数字常量

注意: 变量区分大小写,所以x 和X(大写)表示不同的变量

变量名只能由数字字母下划线组成,而且不能以数字开头

变量使用不区分类型,使用前不必初始化

z ="Hello"

z ="Hello" "World"

z =$1

以上几种都是合法的

常用算数操作符

+Addition

-Subtraction

*Multiplication

/Division

%Modulo

x=1

给x赋值

y=x+1

计算x的值,使它加1,并将结果赋给变量y。

printy

打印y的值。

我们可以将这3个语句减少为两个:

x=1

printx+1

7

常用赋值操作符

++Add 1 to variable.

--Subtract 1 from variable.

+=Assign result of addition.

-=Assign result of subtraction.

*=Assign result of multiplication.

/=Assign result of division.

%=Assign result of modulo.

^=Assign result of exponentiation.(取幂)

计算文件中空行的数目

#Count blank lines.

/^$/{

printx += 1

}

x=x+1x+=1 ++x x++

这几种有什么区别?

#Count blank lines.

/^$/{

++x

}

END {

printx

}

计算学生的平均成绩

mona70 77 85 83 70 89

john85 92 78 94 88 91

andrea89 90 85 94 90 95

jasper84 88 80 92 84 82

dunce64 80 60 60 61 62

ellis90 98 89 96 96 92

$ awk-f src2.awk grades

john87.4

andrea86

jasper85.6

src2.awk

#average five grades

{total = $2 + $3 + $4 + $5 + $6

avg =total / 5

print$1, avg }

也可以使用print $1, total / 5

系统变量

FS 定义字段分隔符,默认为一个空格

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

RS 记录分隔符,默认为一个换行符

ORS 输出的记录分隔符,默认为一个换行符

NR 行数

FNR行数,多文件操作时会重新排序

NF 输出当前输入记录的编号(字段的个数)

FILENAME文件名

例如:

$ awk–F: ‘OFS=”aaa”,ORS=”bbb” {print NR,FNR,NF,FILENAME}’

/etc/passwda.txt

$print NR “.”,$1, avg

1.john 87.4

2.andrea 86

3.jasper 85.6

处理多行记录

JohnRobinson

KorenInc.

978Commonwealth Ave.

Boston

MA01760

696-0987

#block.awk - print first and last fields

# $1 =name; $NF = phone number

BEGIN{ FS = "\n"; RS = " " }

{print $1, $NF }

$ awk-f block.awk phones.block

JohnRobinson 696-0987

PhyllisChapman 879-0900

JeffreyWillis 914-636-0000

AliceGold (707) 724-0000

BillGold 1-707-724-0000

关系操作符和布尔操作符

关系操作符

<Less than

>Greater than

<=Less than or equal to

>=Greater than or equal to

==Equal to

!=Not equal to

~Matches

!~Does not match

NF ==5 NF(每个输入记录的字段数)的值和5相比较,如果结果为真,那

么就进行相应的处理,否则不进行处理。

$5 ~/MA/ {print $1 “,”$6}

注意:关系操作符==和赋值操作符=是不同的

布尔操作符

||Logical OR

&&Logical AND

!Logical NOT

NF ==6 && NR > 1

字段的数量必须等于6并且记录的编号必须大于1。

NR>1 && NF >=2 || $1 ~ /\t/

(NR>1 && NF >=2 )|| $1 ~ /\t/

!(NR> 1 && NF > 3)

获取文件的信息

$ ls-l |awk -f src3.awk

BEGIN{ print "BYTES", "\t", "FILE" }

{

sum+= $5

++filenum

print$5, "\t", $8

}

END {print "Total: ", sum, "bytes (" filenum " files)"}

格式化打印

printf( format-expression [, arguments] )

cASCII 字符

d 十进制整数

f 浮点格式

s 字符串

x 无符号十六进制

常用举例:

语法 %-width.precision format-specifier

printf("%d \t %s \n ", $5 , $8 )

printf("|%10s|\n","hello") 右对齐

printf("|%-10s|\n","hello") 左对齐

printf("%*.*f\n",5, 3, myvar) 宽度5 精度3 打印myvar

向脚本传递参数

awk'script' var=value inputfile

$var=root

$ awk–F: -v a=$var ‘$1==a {print}’ /etc/passwd

二 条件、循环

条件语句

if ( expression )

action1

[else

action2]

例如:

if (x ) print x

如果x是零,则print语句将不执行。如果x是一个非零值,将打印x的值。

if (x == y ) print x

if (x ~ /[yY](es)?/ ) print x

如果操作是由多个语句组成,要用一个大括号将操作括起来

if ( expression ) {

statement1

statement2

}

其他的例子:

if (avg >= 65 )

grade= "Pass"

else

grade= "Fail"

if(avg >= 90) grade = "A"

elseif (avg >= 80) grade = "B"

elseif (avg >= 70) grade = "C"

elseif (avg >= 60) grade = "D"

elsegrade = "F"

这种能够连续条件只有当一个条件表达式计算结果为真时才停止求值,这时将

跳过其他的条件。如果没有一个条件表达式的计算结果为真,将执行最后的

else部分。

条件操作符

expr ? action1 : action2

例如:

grade= (avg >= 60) ? "Pass" : "Fail"

循环

while循环

while循环语法:

while(condition)

action

例如:

i = 1

while( i <= 4 ) {

print$i

++i

}

do 循环

do

action

while(condition)

例如:

BEGIN{

do {

++x

printx

}while ( x <= 4 )

}

for 循环

for (set_counter ; test_counter ; increment_counter )

action

例如:

从第一个字段到最后一个字段

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

print$i

从最后一个字段到第一个字段

for (i = NF; i >= 1; i-- )

print$i

用for实现

total= 0

for(i = 2; i <= NF; ++i)

#total= $2 + $3 + $4 + $5 + $6

#avg= total / 5

total+= $i

avg =total / (NF - 1)

求阶乘

5!=5*4*3*2*1

fact= number

for(x = number - 1 ; x > 1; x--)

fact*= x

完整脚本 factorial

影响流控制的其他语句

影响控制流

break退出循环

continue终止当前的循环,并从循环的顶部开始一个新的循环

影响主输入循环

next 读入下一行,并返回脚本的顶部

exit 使主输入循环退出并将控制转移到END

内容概要:本文系统介绍了基于C#(VS2022+.NET Core)与HALCON 24.11的工业视觉测量拟合技术,涵盖边缘提取、几何拟合、精度优化及工业部署全流程。文中详细解析了亚像素边缘提取、Tukey抗噪算法、SVD平面拟合等核心技术,并提供了汽车零件孔径测量、PCB焊点共面性检测等典型应用场景的完整代码示例。通过GPU加速、EtherCAT同步等优化策略,实现了±0.01mm级测量精度,满足ISO 1101标准。此外,文章还探讨了深度学习、量子启发式算法等前沿技术的应用前景。 适合人群:具备一定编程基础,尤其是熟悉C#和HALCON的工程师或研究人员,以及从事工业视觉测量与自动化检测领域的技术人员。 使用场景及目标:①学习如何使用C#和HALCON实现高精度工业视觉测量系统的开发;②掌握边缘提取、抗差拟合、3D点云处理等核心技术的具体实现方法;③了解工业部署中的关键技术,如GPU加速、EtherCAT同步控制、实时数据看板等;④探索基于深度学习和量子计算的前沿技术在工业视觉中的应用。 其他说明:本文不仅提供了详细的理论分析和技术实现,还附有完整的代码示例和实验数据,帮助读者更好地理解和实践。同时,文中提到的硬件选型、校准方法、精度验证等内容,为实际项目实施提供了重要参考。文章最后还给出了未来的技术演进方向和开发者行动建议,如量子-经典混合计算、自监督学习等,以及参与HALCON官方认证和开源社区的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值