论坛首页 编程语言技术论坛

awk平时使用心得

浏览 1750 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-09  


1、cat exe1 | awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}'

aaa 6
bbb 2
ccc 4

2、awk '{a[$0]++}END{l=asorti(a);for(i=1;i<l;i++)print a[i]}' exe2
a
aa
bb
cc
d
dd
e
f
ff
k
mm
nn

3、[@83_20 exercise]$ awk '{a[$1]++}END{l=asorti(a,b);for(i=1;i<l;i++)print b[i],a[b[i]]}' exe3     
aa 2
bb 2
cc 3
dd 4
mm 2
nn 1

4、什么是NR和FNR
比如现在AWK处理到第五行。第一行没有进行操作,2,3,4,5行进行了操作,那么NR=5,FNR=4
 NR==FNR 表示从起始行到当前行,awk都进行了操作,比如修改,添加等等
简单来说,NR就是当前读取多少行,FNR就是当前修改了多少行,FNR<=NR

NR: 当前所有文件的当前记录数。
FNR:当前文件的当前记录数.

NR - Number of Record - 当前处理的行是第几行(因为awk是流处理工具,一行一行处理的,所以NR在不停的自增1)
FNR - File Number of Record - 当前处理的行是当前处理文件的第几行
NF - Number of Fileds - 当前行有多少列数据(这个在每行都会根据设定的分割符重新计算,默认分割符是任务长个空白符)

(NR==FNR) 大致等效于 (ARGIND==1) , 前者就是说当然处理的总行数跟文件内行数相等,而这种情况一般来说都是在第一个文件上,而ARGIND==1是参数位置第1的文件时生效。
<也有可能前面的文件是空的,那么NR==FNR就生效于第一个非空文件,这就是跟ARGIND==1的明显区别>

5、[@83_20 exercise]$ awk '{a[$NF]=$0}END{l=asorti(a,b);for(i=1;i<=l;i++)print i"\t"b[i]"\t"a[b[i]]}' exe4
1       12      78 90 12
2       56      12 34 56
3       89      23 45 89

[解析]

  首先明白按最后一个域排序,即把最后一个域做为下标,把该行的值存入数组a,本案文本是3行,执行完后得到如下内容:

  a[56]=12 34 56

  a[12]=78 90 12

  a[89]=23 45 89

END,在最后执行命令,asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量l。然后必须用for循环取出数组的下标,因为数组是无法直接print打印的,这时候打印输出变量i,排序后的数字b的下标的值,然后把该下标在数组a中的赋值打印出来。
内置函数asort只对值进行排序,会丢掉原来的数组值


6、aaa 1
aaa 3
ccc 12
aaa 8
bbb 89
ccc 16
eee 12
ccc 11
eee 13
fff 16
ddd 56
要求对以上文本按第一列的名称进行第2列的求和,并且按升序排列打印。

 

awk '{a[$1]+=$2}END{for(i in a){print i,a[i]}}' file
aaa 12
ccc 39
eee 25
bbb 89
ddd 56
fff 16
[解析]
  把$1为下标,把$2的值累加到以$1为下标的数组a的值上,然后用for(i in a)这最普通的常用的方式取出数组中的下标和其对应的值,但是这种方式是随机取出的。怎么能达到升顺输出呢?我们看下面的例子。


 

awk '{a[$1]+=$2}END{l=asorti(a,b);for(i=1;i<=l;i++){print b[i],a[b[i]]}}' file
aaa 12
bbb 89
ccc 39
ddd 56
eee 25
fff 16
[解析]
  第一部分操作和上句一样,只是后面增加了awk的内置排序的函数asorti,然后通过for循环顺序依次取出a数组的下标和对应的值。

7、awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}'
8、awk 'BEGIN{info="this is a test2012test!";gsub(/[0-9]+/,"!",info);print info}'
9、cat exe4 exe5 | sort -n -k1 | awk 'NR%2==1{fd1=$2"\t"$3;next}{print $0"\t"fd1}'
10、awk 'NR==FNR{a[$0]=1;print} NR>FNR{if(!(a[$0])){print}'} aa1 bb1   【两文件的交集】

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics