免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yinyuemi

[学习共享] awk初学之常见问题 [复制链接]

论坛徽章:
0
发表于 2011-05-09 18:46 |显示全部楼层

谢谢TIM,黑哥,yinyuemi.

论坛徽章:
0
发表于 2011-05-13 17:45 |显示全部楼层
谢谢分享!!!好帖子

论坛徽章:
0
发表于 2011-07-11 13:55 |显示全部楼层
谢谢,有收获

论坛徽章:
0
发表于 2011-07-13 17:49 |显示全部楼层
对初学者真长知识!!

论坛徽章:
0
发表于 2011-11-07 09:40 |显示全部楼层
回复 1# yinyuemi


    awk '$1==3{printf "|| "$0}{printf " @@ "$0}{print $0}' file

请问“||” “@@” 是什么意思啊,没怎么看懂这里!

论坛徽章:
28
ChinaUnix元老
日期:2015-02-02 08:55:392017金鸡报晓
日期:2017-01-10 15:13:29CU十四周年纪念徽章
日期:2018-08-29 22:12:2715-16赛季CBA联赛之深圳
日期:2018-09-20 12:21:09
发表于 2011-11-07 09:59 |显示全部楼层
本帖最后由 Shell_HAT 于 2015-07-06 11:52 编辑

回复 35# tt_yy123


就是两个普通的字符串,没有什么特殊含义,你高兴的话可以换成别的。
目的是让你看清楚到底是哪个{}里面的内容在执行。




关于awk的多文件处理:

awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件,如
1、shell的Pathname Expansion方式:awk '{...}'  *.txt      #  *.txt先被shell解释,替换成当前目录下的所有*.txt,如当前目录有1.txt和2.txt,则命令最终为awk '{...}' 1.txt 2.txt
2、直接指定多个文件: awk '{...}' a.txt b.txt c.txt ...
awk对多文件的处理流程是,依次读取各个文件内容,如上例,先读a.txt,再读b.txt....

那么,在多文件处理的时候,如何判断awk目前读的是哪个文件,而依次做对应的操作呢?
1、当awk读取的文件只有两个的时候,比较常用的有两种方法
一种是awk 'NR==FNR{...}NR>FNR{...}'  file1 file2   或awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
另一种是 awk 'NR==FNR{...;next}{...}' file1 file2
了解了FNR和NR这两个awk内置变量的意义就很容易知道这两种方法是如何运作的

FNR         The input record number in the current input file.       #已读入当前文件的记录数
NR          The total number of input records seen so far.            #已读入的总记录数
next    Stop processing the current input record.  The next input record  is
        read  and  processing  starts over with the first pattern in the AWK
        program.  If the end of the input data is reached, the END block(s),
        if any, are executed.

对于awk 'NR==FNR{...}NR>FNR{...}'  file1 file2
读入file1的时候,已读入file1的记录数FNR一定等于awk已读入的总记录数NR,因为file1是awk读入的首个文件,故读入file1时执行前一个命令块{...}
读入file2的时候,已读入的总记录数NR一定>读入file2的记录数FNR,故读入file2时执行后一个命令块{...}

对于awk 'NR==FNR{...;next}{...}' file1 file2
读入file1时,满足NR==FNR,先执行前一个命令块,但因为其中有next命令,故后一个命令块{...}是不会执行的
读入file2时,不满足NR==FNR,前一个命令块{..}不会执行,只执行后一个命令块{...}

2、当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来。
所以就要用到更通用的方法了:
1、ARGIND 当前被处理参数标志: awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...
2、ARGV 命令行参数数组:   awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...   
3、把文件名直接加入判断: awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...
#没有前两种通用

论坛徽章:
0
发表于 2011-11-07 11:13 |显示全部楼层
回复 36# Shell_HAT
cat aa
1
2
3
4
5


awk '$1==3{printf "|| "$0}{printf " @@ "$0}{print $0}' aa
1@@ 1
2@@ 2
3@@ 3
4@@ 4
5@@ 5


没看懂啊。怎么执行的啊。。
不是$1等于3的时候才执行后面的命令么?
awk '$1==3{printf "|| "$0}' aa
awk '$1==3{printf "|| "$0}{printf " @@ "$0}' aa
为什么这样执行什么也没有。。。

论坛徽章:
28
ChinaUnix元老
日期:2015-02-02 08:55:392017金鸡报晓
日期:2017-01-10 15:13:29CU十四周年纪念徽章
日期:2018-08-29 22:12:2715-16赛季CBA联赛之深圳
日期:2018-09-20 12:21:09
发表于 2011-11-07 11:24 |显示全部楼层
回复 37# tt_yy123
  1. dos2unix aa | awk '$1==3{printf "|| "$0}'
复制代码

论坛徽章:
0
发表于 2011-11-07 11:32 |显示全部楼层
回复 38# Shell_HAT


    dos2unix aa | awk '$1==3{printf "|| "$0}'

--->谢谢这位仁兄!!!

论坛徽章:
0
发表于 2011-11-07 13:53 |显示全部楼层
小伙子学习尽头十足,忘继续保持,加油
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:help@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP