【转】awk 实例练习2

上一篇,这里使用的grade.txt 也是和上一篇中的相同。

先来总结一下awk内置变量:

ARGC          命令行参数个数
ARGV          命令行参数排列
ENVIRON       支持队列中系统环境变量的使用
FILENAME      awk浏览文件名
FNR           浏览文件的记录数
FS            设置输入域分隔符,等价于命令行-F选项
NF            浏览记录的域个数
NR            已读的记录数
OFS           输出域分隔符
ORS           输出例句分隔符
RS            控制记录分隔符
 
 
zhuyupeng@zhuyupeng-PC ~
$awk '{print NF,NR,$0} END {print FILENAME}' grade.txt
7 1 M.Tansley   05/99   48311   Green   8       40      44
7 2 J.Lulu      06/99   48317   green   9       24      26
7 3 P.Bunny     02/99   48      Yellow  12      35      28
7 4 J.Troll     07/99   4842    Brown-3 12      26      26
7 5 L.Tansley   05/99   4712    Brown-2 12      30      28
grade.txt
 
#使用 -F 参数指定分隔符
zhuyupeng@zhuyupeng-PC ~
$echo $PWD
/home/zhuyupeng
 
zhuyupeng@zhuyupeng-PC ~
$echo $PWD | awk -F/ '{print $NF"\t"NF}'
zhuyupeng       3

#设置变量名,将27 赋值给变量BASELINE
zhuyupeng@zhuyupeng-PC ~
$awk 'BEGIN {BASELINE="27"} $6<BASELINE {print $0}' grade.txt
J.Lulu  06/99   48317   green   9       24      26
J.Troll 07/99   4842    Brown-3 12      26      26

#修改数值域取值,注意‘{}’
zhuyupeng@zhuyupeng-PC ~
$awk '{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade.txt
M.Tansley 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansley 30 28
 
#修改文本域取值
zhuyupeng@zhuyupeng-PC ~
$awk '{if($1=="J.Troll") $1="J.L.Troll"; print $1}' grade.txt
M.Tansley
J.Lulu
P.Bunny
J.L.Troll
L.Tansley

#创建新的输出域,这里新的输出域为 diff
zhuyupeng@zhuyupeng-PC ~
$awk 'BEGIN {print "Name \t Difference"} {if($6<$7) {diff=$7-$6; print $1,diff}}' grade.txt
Name     Difference
M.Tansley 4
J.Lulu 2
 
#统计某一个域的和,使用‘+=’ 下面的例子统计第六个域的和
zhuyupeng@zhuyupeng-PC ~
$awk '(tot+=$6); END{print "Club student total points: " tot}' grade.txt
M.Tansley       05/99   48311   Green   8       40      44
J.Lulu  06/99   48317   green   9       24      26
P.Bunny 02/99   48      Yellow  12      35      28
J.Troll 07/99   4842    Brown-3 12      26      26
L.Tansley       05/99   4712    Brown-2 12      30      28
Club student total points: 155

#注意区别,加‘{}’则不打印文件
zhuyupeng@zhuyupeng-PC ~
$awk '{(tot+=$6)}; END{print "Club student total points: " tot}' grade.txt
Club student total points: 155

awk 内置字符串函数
 
gsub(r,s)          在整个$0中用s替代r
gsub(r,s,t)        在整个t中使用s替代r
index(s,t)         在返回s中字符串t的第一个位置
length(s)          放回s长度
match(s,r)         测试s是否包含匹配r的字符串
split(s,a,fs)      在fs上将s分成序列a
sprint(fmt,exp)    返回经fmt格式化后的exp
sub(r,s)           用$0中最左边最长的子串代替s
substr(s,p)        返回字符串s中从p开始的后缀部分
substr(s,p,n)      返回字符串s中从p开始长度为n的后缀部分
 
#替换,目标串使用正则表达式格式‘//’
zhuyupeng@zhuyupeng-PC ~
$awk 'gsub(/4842/,4899) {print $0}' grade.txt
J.Troll 07/99   4899    Brown-3 12      26      26
 
#查询字符串第一次出现的位置,注意使用BEGIN,否则每一行都会打印,字符串使用引号括起来
zhuyupeng@zhuyupeng-PC ~
$awk 'BEGIN{print index("Bunny","ny")}' grade.txt
4
 
#长度
zhuyupeng@zhuyupeng-PC ~
$awk '$1=="J.Troll" {print length($1)" "$1}' grade.txt
7 J.Troll

#match 使用: 找不到返回0,找到返模式串在匹配串中的位置
#注:单独使用 加BEGIN
zhuyupeng@zhuyupeng-PC ~
$awk 'BEGIN {print match("ANCD",/d/)}'
0

#以下两种模式都正确
zhuyupeng@zhuyupeng-PC ~
$awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt
4
 
zhuyupeng@zhuyupeng-PC ~
$awk '$1=="J.Lulu" {print match($1,/u/)}' grade.txt
4

#split 返回字符串数组元素个数
zhuyupeng@zhuyupeng-PC ~
$awk 'BEGIN {print split("123#456#789",myarray,"#");print myarray[1],myarray[2],myarray[3]}'
3
123 456 789

#sub,发现并替换模式的第一个位置
zhuyupeng@zhuyupeng-PC ~
$awk '$1=="J.Troll" {sub(26,29,$0)} {print $0}' grade.txt
M.Tansley       05/99   48311   Green   8       40      44
J.Lulu  06/99   48317   green   9       24      26
P.Bunny 02/99   48      Yellow  12      35      28
J.Troll 07/99   4842    Brown-3 12     29      26
L.Tansley       05/99   4712    Brown-2 12      30      28
 
#substr,返回字符串指定范围内的子串
zhuyupeng@zhuyupeng-PC ~
$awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
L.Tan

#使用substr返回指定位置开始的后缀部分,范围只给了一个参数,注意和上一个例子相对比
zhuyupeng@zhuyupeng-PC ~
$ awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley

#从shell中向awk传递字符串,通过 echo 加管道的方式
zhuyupeng@zhuyupeng-PC ~
$echo "Test" | awk '{print length($0)}'
4
 
zhuyupeng@zhuyupeng-PC ~
$ STR="mydoc.txt"
 
zhuyupeng@zhuyupeng-PC ~
$echo $STR | awk '{print substr($STR,7)}'
txt
在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值