linuxawk说明(分割符/NR&NFR区别) awk nr fnr

1、设置FS,可在BEGIN时进行设置,后面进行共享。如for file in *.*; do mv $file `echo $file | awk 'BEGIN{FS="."}{print $1 ".ss"}'`; done==将当前目录下的文件进行后缀重命名
也可通过-F选项进行设置,如for file in *.*; do mv $file`echo $file | awk -F . '{print $1 ".ss"}'`;done
2、NR,表示awk开始执行程序后所读取的数据行数.FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计.在看一个例子关于NR和FNR的典型应用:#cat a
张三|000001
李四|000002#cat b
000001|10
000001|20
000002|30
000002|15

想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
  1. awk-F'|''NR==FNR{a[$2]=$0;next}{printa[$1]FS$2}'ab

  2. awk-F'|''{a[$2]=$0}NR>FNR{printa[$1]FS$2}'ab

[解析]
由NR=FNR成立,判断当前读入的是第一个文件a,然后使用{a[$2]=$0;next}循环将a文件的每行记录都存入数组a,并使用$2作为下标引用.next,不在执行后面的语句.
由NR=FNR不成立,判断当前读入了第二个文件b ,然后跳过{a[$2]=$0;next},对第二个文件b的每一行都无条件执行{printa[$1]FS$2},此时变量$1为第二个文件的第一个字段,与读入第一个文件时,采用第一个文件的$2为数组下标相同.因此可以在此输出该数组的值。下面那种写法是不是更短呢?

第二个例子:

文件passwd:
s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw

文件shadow:
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::

用shadow文件中的密文部分替换passwd中的"x",生一个新passwd文件,如下所示
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw

  1. awk'BEGIN{FS=OFS=":"}NR==FNR{a[$1]=$2;next}{$2=a[$1]}1'shadow passwd

[解析]
NR==FNR,第一个文件shadow,以$1为下标,将$2的值赋给数组a,next不再执行后面的语句。
NR>FNR,第二个文件passwd,把$1为下标的数组a的值赋给密码x,就是$2。

第三个例子:

catfile1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401

catfile2:
I0011 11111
I0012 22222
I0014 55555
I0013 66666

规则:比较 file1的1-4字符 和file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并file3
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555

  1. awk'NR==FNR{a[substr($1,2)]=$2;next}{$0=$0FS a[substr($1,1,4)]}1'file2 file1

[解析]
当NR=FNR时(就是file2文件),以substr(截取)file2文件第一个域的第2个字符开始,以长度为4的字符段为下标,把$2的值存入数组a中,next不再执行后面的语句。
读到第2个文件时候,pattern不再匹配,则执行后面的语句:打印第2个文本的全行,后面增加以$1为下标的数组a的值。

第四个例子:

file1文件
10.5100
101536.5

file2文件
50109
3.215

将两个文件对应的字段进行相加以后的数字合成一个文件如:
5110.5109
13.21641.5

  1. awk'NR==FNR{for(i=1;i<=NF;i++)a[FNR,i]=$i;next}{for(i=1;i<=NF;i++)$i=$i+a[FNR,i]}1'file1 file2

[解析]
把file1中的每个字段用二维下标存放进数组a,当pattern不成立时,执行后面的语句,把file2的每个字段和二维数组的值相加。

  1. awk'{for(i=1;i<=NF;i++)a[FNR,i]+=$i}END{for(i=1;i<=FNR;i++){for(j=1;j<NF;j++)printf("%-5s",a[i,j]);printa[i,j]}}'file1file2
[解析]
这是在读文件的同时就把2个文件中的二维数组的值相累加,最后再通过2次for循环格式化输出结果。此方式更好的能用于N个文件的每个数字的累加。

  

爱华网本文地址 » http://www.413yy.cn/a/25101015/258740.html

更多阅读

组装机与品牌机的区别 品牌机玩游戏怎么样

组装机与品牌机的区别——简介很多想购买电脑的网友都会问到一个问题,组装机与品牌机有什么区别?首先说明一点,品牌机也是组装的,只不过,品牌机的各部件都是在公司里经过严格测试和检验的,所以兼容性很好。当然品牌机和组装机的区别不是就

怎样区别珍珠罗汉鱼与金花罗汉鱼 泰国金花罗汉鱼

概述罗汉鱼的品种已经无法估计,名字也是千奇百怪,因为本身罗汉就是一种杂交出来的鱼,好听的名字更是说不尽数不清,大多数都是由珍珠系和金花系演变而来,例如金花又分为帝王金花、彩虹金花等等。有一些商家利用了鱼友的不了解,以次充好欺骗

托福雅思GRE的区别 雅思托福一对一

托福雅思GRE的区别——简介很多人不知道托福和雅思的区别,所以选择考试的时候会很迷茫,现在就介绍一点托福雅思的区别,顺带还说一下GRE。托福雅思GRE的区别——工具/原料托福雅思的官方OG托福雅思的官方介绍说明托福雅思GRE的区别——

iPhone5s港版和国行区别 iphone5s水货

iPhone5s港版和国行区别——简介iPhone5s港版和国行区别在那里呢?下面分别从硬件配置,无线网络,保修等几方面说明下它们的区别。iPhone5s港版和国行区别——工具/原料iPhone5siPhone5s港版和国行区别——硬件配置iPhone5s港版和国行

声明:《linuxawk说明(分割符/NR&NFR区别) awk nr fnr》为网友执手相看泪眼分享!如侵犯到您的合法权益请联系我们删除