请使用awk命令将如下两份文件中名字相同的两行合并起来 A文件: 孙行者 50岁 行者孙 500岁 者行孙 5000岁 孙者行 50000岁 B文件: 行者孙 男 者行孙 男 孙行者 男 孙者行 男 输出效果: 孙行者 50岁 男
[root@localhost ~]$ cat a b |sort -k1 |awk 'BEGIN{t=""}{t=$1;if(tt==t){printf("%s",$2);printf("\n")}else{printf("%s %s ",$1,$2);}tt=t}' 孙者行 50000岁 男 孙行者 50岁 男 者行孙 5000岁 男 行者孙 500岁 男
思路:先合并两个文件并排序
[root@localhost ~]$ cat a b |sort -k1 孙者行 50000岁 孙者行 男 孙行者 50岁 孙行者 男 者行孙 5000岁 者行孙 男 行者孙 500岁 行者孙 男
先定义一个容器为$1,也就是名字,然后做判断如果下一行的$1与这个相同的话,只输出$2,并换行。因为定义为空,所以不符合所以判断else输出$1,$2 也就是 孙者行 50000。其后判断相同只输出 $2 并换行。 如果说要的输出效果是 孙行者 50岁 男
那要怎么办呢?
cat a b |sort -k1 |awk 'BEGIN{t=""}{t=$1;if(tt==t){printf("\t");printf("%s",$2);printf("\n")}else{printf("%s %s",$1,$2);printf("\n")}tt=t}' 孙者行 50000岁 男 孙行者 50岁 男 者行孙 5000岁 男 行者孙 500岁 男 思路其实都是一样的。
cat blog.log http://www.baidu.org/index.html http://www.baidu.org/1.html http://post.baidu.org/index.html http://mp3.baidu.org/index.html http://www.baidu.org/2.html http://post.baidu.org/2.html
如果要得到中间的域名怎么写呢?
awk -F '[/]+' 'BEGIN{print "site""\t""count"}{array[$2]++}END{for(key in array) print key,"\t" array[key]}' blog.log
site count www.baidu.org 3 post.baidu.org 2 mp3.baidu.org 1
以‘/’为分隔符,这里定义一个数组。
另外的一种方法:
awk '{split($0,array,"/+");key=array[2];count[key]++}END{for(kk in count)print kk count[kk]}' blog.log
如果不是算这种个数,而是平均数呢?如下:
工号 名字 工资 求平均工资呢
cat average.txt 001 wudi 1000 002 jony 2000 003 wudi 2000 004 jony 3000 005 deng 2500
[root@MonitorANDBack ~]$ awk '{array[$2]+=$3;count[$2]++}END{for (key in array) print key,array[key],array[key]/count[key]}' average.txt jony 5000 2500 deng 2500 2500 wudi 3000 1500
这里可以看到名字,总数以及平均数 这里count[]为一个函数
一下为数组的简单理解: [root@MonitorANDBack ~]$ array=(good morning sir) [root@MonitorANDBack ~]$ echo ${array[0]} good [root@MonitorANDBack ~]$ echo ${array[1]} morning [root@MonitorANDBack ~]$ echo ${array[2]} sir [root@MonitorANDBack ~]$ echo ${array[3]} [root@MonitorANDBack ~]$ echo ${array[@]} good morning sir [root@MonitorANDBack ~]$ echo ${array[#]} -bash: #: syntax error: operand expected (error token is "#")