首页 技术 正文
技术 2022年11月15日
0 收藏 954 点赞 4,932 浏览 7365 个字

文件car:

plym fury
chevy malibu
ford mustang
volvo s80
ford thundbd
chevy malibu
bmw 325i
honda accord
ford taurus
toyota rav4
chevy impala
ford explor

基本

awk '{print}' car    #类似标准输出
awk '/chevy/' car    #包含字符串的所有文本行进行复制
chevy malibu
chevy malibu
chevy impala
dahu@dahu-OptiPlex-:~/myfile$ awk '/10/' car    #只要包含,以字符串的形式
ford mustang
volvo s80
ford thundbd
ford taurus
dahu@dahu-OptiPlex-:~/myfile$ awk '{print $1,$3}' car    #显示第一列,空格,第三列
dahu@dahu-OptiPlex-:~/myfile$ awk '/chevy/{print $1,$3}' car    #匹配行,选中列
chevy
chevy
chevy
dahu@dahu-OptiPlex-:~/myfile$ awk '$2 ~ /[0-9]/' car   #第二列匹配某种正则,最后显示所有行
volvo s80
bmw 325i
toyota rav4
dahu@dahu-OptiPlex-:~/myfile$ awk '$2 ~ /^[tm]/{print $3,$2,"$"$5}' car    #第2个字段匹配正则,并按要求显示
malibu $
mustang $
thundbd $
malibu $
taurus $
dahu@dahu-OptiPlex-:~/myfile$ awk '$5<=3000' car    #按大小查找
plym fury
chevy malibu
bmw 325i
toyota rav4
chevy impala
dahu@dahu-OptiPlex-:~/myfile$ awk '/volvo/,/bmw/' car    #匹配两个之间的行
volvo s80
ford thundbd
chevy malibu
bmw 325i
dahu@dahu-OptiPlex-:~/myfile$ awk '/chevy/,/ford/' car    #贪心,尽可能多的获取行,和上面例子类似
chevy malibu
ford mustang
chevy malibu
bmw 325i
honda accord
ford taurus
chevy impala
ford explor
awk -f file car

file 里可以写awk程序,也就是上面引号的内容,不需要加引号.

BEGIN

dahu@dahu-OptiPlex-:~/myfile$ cat aaa    #前缀
BEGIN{
print "Make Mode Year Miles Price"
print "----------------------------"
}
{print}
dahu@dahu-OptiPlex-:~/myfile$ awk -f aaa car
Make Mode Year Miles Price
----------------------------
plym fury
chevy malibu
ford mustang
volvo s80
ford thundbd
chevy malibu
bmw 325i
honda accord
ford taurus
toyota rav4
chevy impala
ford explor

length

dahu@dahu-OptiPlex-:~/myfile$ awk '{print length,$0}' car|sort -n    #显示每一行的字符数(包含空格的数量),并按顺序排序,length后也可加括号
bmw 325i
plym fury
volvo s80
ford explor
toyota rav4
chevy impala
chevy malibu
chevy malibu
ford taurus
honda accord
ford mustang
ford thundbd

NR

dahu@dahu-OptiPlex-:~/myfile$ awk '{print NR,$0}' car    #显示行数,NR记录编号,NF字段数目
plym fury
chevy malibu
ford mustang
volvo s80
ford thundbd
chevy malibu
bmw 325i
honda accord
ford taurus
toyota rav4
chevy impala
ford explor
dahu@dahu-OptiPlex-:~/myfile$ awk 'NR==2,NR==4' car    #显示第2行到第4行的内容,太方便了!
chevy malibu
ford mustang
volvo s80

END

dahu@dahu-OptiPlex-:~/myfile$ awk 'END {print NR,"cars for sale"}' car    #end表示数据已处理之后,此时NR就是总行数了
cars for sale

if

dahu@dahu-OptiPlex-:~/myfile$ cat aaa  #if的简短用法,没有使用花括号
{
if ($ ~ /ply/) $ ="plymouth"
if ($ ~ /chev/) $ ="chevrolet"
print
}
dahu@dahu-OptiPlex-:~/myfile$ awk -f aaa car
plymouth fury
chevrolet malibu
ford mustang
volvo s80
ford thundbd
chevrolet malibu
bmw 325i
honda accord
ford taurus
toyota rav4
chevrolet impala
ford explor
dahu@dahu-OptiPlex-:~/myfile$ cat aaa  #程序稍加改进,把awk程序文件直接改成可直接运行的,增加一下可执行的权限chmod 744  aaa
#!/usr/bin/awk -f
{
if ($ ~ /ply/) $ ="plymouth"
if ($ ~ /chev/) $ ="chevrolet"
print
}
dahu@dahu-OptiPlex-:~/myfile$ ./aaa car
dahu@dahu-OptiPlex-:~/myfile$ cat price_range
#{                                #这边是将第五列改成评价
#if ($5 <=5000) $5="cheap";
#else if (5000<$5 && $5<10000) $5="please ask";
#else if ($5>=10000) $5="expensive";
#print $
#}
BEGIN{
s="cheap"
}
{                                  #保留第5列
if ($ <=) s="cheap";
else if (<$ && $<) s="please ask";
else if ($>=) s="expensive";
print $,s                          #显示的时候,注意$
}
dahu@dahu-OptiPlex-:~/myfile$ awk -f price_range car
plym fury cheap
chevy malibu cheap
ford mustang expensive
volvo s80 please ask
ford thundbd expensive
chevy malibu cheap
bmw 325i cheap
honda accord please ask
ford taurus expensive
toyota rav4 cheap
chevy impala cheap
ford explor please ask

OFS  

什么样的情况下才会按照新格式输出呢?

dahu@dahu-OptiPlex-:~/myfile$ cat aaa  #OFS输出字段分隔符,默认是空格,但是我改了之后发现只有满足if条件的才会按照新格式输出,如果注释掉了if,就都不会按照新格式输出,存疑.
#!/usr/bin/awk -f
BEGIN{OFS=" >> "}
{
if ($ ~ /ply/) $ ="plymouth"
if ($ ~ /chev/) $ ="chevrolet"
print $
}dahu@dahu-OptiPlex-:~/myfile$ ./aaa car
plymouth >> fury >> >> >>
chevrolet >> malibu >> >> >>
ford mustang
volvo s80
ford thundbd
chevrolet >> malibu >> >> >>
bmw 325i
honda accord
ford taurus
toyota rav4
chevrolet >> impala >> >> >>
ford explor

printf

dahu@dahu-OptiPlex-:~/myfile$ cat aaa  #printf改善输出格式
#!/usr/bin/awk -f
BEGIN{
print " Miles"
print "Make Mode Year (000) Price "
print \
"--------------------------------------------"
}
{
if ($ ~ /ply/) $ ="plymouth"
if ($ ~ /chev/) $ ="chevrolet"
printf "%-10s %-8s %2d %5d $ %8.2f\n",\
$,$,$,$,$
}dahu@dahu-OptiPlex-:~/myfile$ ./aaa car
Miles
Make Mode Year () Price
--------------------------------------------
plymouth fury $ 2500.00
chevrolet malibu $ 3000.00
ford mustang $ 10000.00
volvo s80 $ 9850.00
ford thundbd $ 10500.00
chevrolet malibu $ 3500.00
bmw 325i $ 450.00
honda accord $ 6000.00
ford taurus $ 17000.00
toyota rav4 $ 750.00
chevrolet impala $ 1550.00
ford explor $ 9500.00
dahu@dahu-OptiPlex-:~/myfile$ cat redirect     #重定向输出
#!/usr/bin/awk -f
/chevy/ {print > "chevfile"}
/ford/ {print > "fordfile"}
END {print "done."}dahu@dahu-OptiPlex-:~/myfile$ ./redirect car
done.
dahu@dahu-OptiPlex-:~/myfile$ cat chevfile
chevy malibu
chevy malibu
chevy impala
dahu@dahu-OptiPlex-:~/myfile$ cat fordfile
ford mustang
ford thundbd
ford taurus
ford explor

FS

输入字段分隔符

for

dahu@dahu-OptiPlex-:~/myfile$ cat manuf   #for结构,第一列的内容放入这个字典
awk '{manuu[$1]++}
END {for (name in manuu) {print name ,manuu[name]}}' car    #里面的花括号也可以不用加,命令之间用;间隔
dahu@dahu-OptiPlex-:~/myfile$ ./manuf
honda
bmw
volvo
ford
plym
chevy
toyota
dahu@dahu-OptiPlex-:~/myfile$ cat mmanuf   #这个程序感觉厉害了
if [ $# != ]
then
echo "something wrong!"
exit
fi
awk < $ '
{count[$'$1']++}      #注意这里,单引号成对出现,两端引号内容连接起来,中间还是直接引用传入的第一个参数,在这里是1,所以调用第一列的内容,666,在END里也试过,单引号随便加,反正连起来的.哪怕是把变量名拆掉也行...吊
END{for (item in count) print item,count[item]}
#END{fo''r (item in count) ''print it''em,count[item]}  #你敢信吗?
'
dahu@dahu-OptiPlex-:~/myfile$ ./mmanuf car
./mmanuf: line : [: : unary operator expected
honda
bmw
volvo
ford
plym
chevy
toyota

实操:

1.统计不重复的个数:

xch27@lanzhou:/asrdata/users/ql826/lmwork/comm_cloud/aicar_solution/v28_24Apr2017/data/radio/slot$ awk 'BEGIN{FS="&"}{print $1}' slot.map |sort -u
CLASS-FM频道
CLASS-主持人
CLASS-序列号
CLASS-频道
CLASS-频道类型

2.统计某一项的个数:

xch27@lanzhou:/asrdata/users/ql826/lmwork/comm_cloud/aicar_solution/v28_24Apr2017/data/radio/slot$ awk 'BEGIN{FS="&";a=0}{if($1 =="CLASS-频道")a++}END{print a}' slot.map
114716

3.找到某几行的内容

dahu@dahu-OptiPlex-3046:~/Downloads$ awk '{if(NR<=4900 && NR>=4800)print $2}' enwords.oov.cnt-gt800.cnt-pron > en

4.匹配我要找的CLASS-XXX,且不重复,for的简单应用

xch27@lanzhou:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v30_23May2017/data/life/music/pat$ head gequ_geshou
<s> CLASS-动作二 CLASS-歌曲名 CLASS-歌手名 唱 的 </s>
<s> CLASS-动作二 CLASS-歌曲名 CLASS-歌手名 的 </s>
<s> CLASS-动作二 CLASS-歌曲名 CLASS-歌手名 的 </s>
<s> CLASS-动作二 CLASS-歌曲名 CLASS-歌手名 的 </s>
<s> CLASS-动作二 CLASS-歌手名 的 CLASS-语种 歌曲 CLASS-歌曲名 </s>
<s> CLASS-动作三 CLASS-歌曲名 的 歌词 CLASS-歌手名 唱 的 </s>
<s> CLASS-动作三 CLASS-歌曲名 的 歌词 CLASS-歌手名 的 </s>
<s> CLASS-动作三 CLASS-歌曲名 的 歌词 CLASS-歌手名 演唱 的 </s>
<s> CLASS-动作三 CLASS-歌手名 唱 的 CLASS-歌曲名 的 歌词 </s>
<s> CLASS-动作三 CLASS-歌手名 的 CLASS-歌曲名 的 歌词 </s>
xch27@lanzhou:/.../pat$ awk '{for(i=2;i<NF;i++)if($i ~ "CLASS-"){print $i}}' gequ_geshou |sort -u
CLASS-动作三
CLASS-动作二
CLASS-操作
CLASS-歌手名
CLASS-歌曲名
CLASS-语种

统计 不匹配”CLASS-“的行数

awk '{a=0;for(i=1;i<=NF;i++){if($i ~ "CLASS-"){a=1}};if(a!=1){count++}}END{print count}' music.comm.mrg.v3.pat.wseg

修改文件内容,多变量传递

#!/bin/bash
#awk传入变量练习,直接修改小麦
fs=`awk '/你好小迈/{print $2}' wakeup.logp`
#echo $fs
#多个变量这样添加
#p=
#echo |awk -v tt="$fs" -v tg="$p" 'BEGIN{print tt,tg}'
ft=`awk '/小迈你好/{print $2}' wakeup.logp`
awk -v nhxm="$fs" -v xmnh="$ft" '{if($1~"你好小麦"){a=nhxm+2;print $1,a}else if($1~"小麦你好"){a=xmnh+2;print $1,a}else{print $0}}' wakeup.logp >tmp

awk根据不同名称输入不同文件.知识点:FS,RS,substr,split,awk内部输出

xch27@taiyuan:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v32_30june2017/data/navi/slot$ head t1
名称:北京南顺油脂有限公司
拼音:BeiJing NanShun YouZhi YouXianGongSi
别称:
地址:良乡南肖庄道口西
类型:公司企业;公司;公司
省:北京市
市:北京市
区县:房山区
热度:9.6901977xch27@taiyuan:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v32_30june2017/data/navi/slot$ awk 'BEGIN{FS="\n";RS="\n\n"}{a=substr($5,4);split(a,A,";");print substr($1,4)>>A[1];}' t1xch27@taiyuan:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v32_30june2017/data/navi/slot$ ls
gaode.alldata..txt readme.sh tmp 体育休闲服务 公司企业 商务住宅 搜索词_0620.txt 生活服务 购物服务 餐饮服务
lineprocess.py t1 住宿服务 全量数据_0620.txt 医疗保健服务 地名地址信息 政府机构及社会团体 科教文化服务 金融保险服务
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289