Chinaunix

标题: 请问对文本中重复的字段计数应该如何处理?将计数的1,2,3在添加到该行最后 [打印本页]

作者: qooweds    时间: 2013-11-20 16:48
标题: 请问对文本中重复的字段计数应该如何处理?将计数的1,2,3在添加到该行最后
本帖最后由 qooweds 于 2013-11-20 16:49 编辑

我有一个csv文件,第三个字段是ip
我想在每行的末尾添加一个字段,代表该ip出现的次数,
比如192.168.1.1在文中是第二次出现,行尾就加上2

文本内容类似为:
aa,bb,192.168.1.1,cc
dd,ee,192.168.1.2,ff
gg,hh,192.168.1.1,ii
jj,kk,192.168.1.3,ll

期待的结果为:
aa,bb,192.168.1.1,cc,1
dd,ee,192.168.1.2,ff,1
gg,hh,192.168.1.1,ii,2
jj,kk,192.168.1.3,ll,1

请问怎么处理好呢?
用sed还是awk好呢?
作者: yestreenstars    时间: 2013-11-20 16:52
果断用awk啦~
  1. [root@localhost ~]# awk -F, '{print $0","++a[$3]}' i
  2. aa,bb,192.168.1.1,cc,1
  3. dd,ee,192.168.1.2,ff,1
  4. gg,hh,192.168.1.1,ii,2
  5. jj,kk,192.168.1.3,ll,1
  6. [root@localhost ~]# cat i
  7. aa,bb,192.168.1.1,cc
  8. dd,ee,192.168.1.2,ff
  9. gg,hh,192.168.1.1,ii
  10. jj,kk,192.168.1.3,ll
  11. [root@localhost ~]#
复制代码

作者: qooweds    时间: 2013-11-20 16:53
我自己用awk写了下
cat test.csv | awk -F"," '{print $3","$1","$2","$4}' |sort |awk -F"," 'BEGIN{i=1}{y=x;x=$1;{if(x==y){i++;print $0","i}else{i=1;print $0","i}}}'

将ip放到第一列,然后sort,通过awk把计数打印到行尾,然后再用awk将ip打印的顺序换回去,貌似很复杂...
作者: jiaogeshahaone    时间: 2013-11-20 16:53
回复 1# qooweds
  1. awk -F, '{c[$3]++;print $0","c[$3]}'
复制代码



   
作者: Shell_HAT    时间: 2013-11-20 16:55
  1. awk 'BEGIN{FS=OFS=","}{print $0,++a[$3]}' urfile
复制代码

作者: qooweds    时间: 2013-11-20 16:57
感谢大家!
懂了!
数组好方便
作者: reyleon    时间: 2013-11-20 17:07
  1. awk 'BEGIN{FS=OFS=","}{print $0,++a[$3]}'
复制代码

作者: 这个冬天不冷    时间: 2013-11-20 17:08
  1. awk -F, '{a[$3]++;print $0,a[$3]}' 1
复制代码

作者: kernel69    时间: 2013-11-21 21:28
来个perl的
  1. perl -F',' -lane 'print "$_,$h{$F[2]}" if ++$h{$F[2]}'
复制代码
回复 1# qooweds


   
作者: yestreenstars    时间: 2013-11-21 21:45
回复 9# kernel69
可以更短些:
  1. perl -F, -lane 'print $_.",".++$h{$F[2]}'
复制代码

作者: kernel69    时间: 2013-11-21 21:49
妙啊
回复 10# yestreenstars


   
作者: kernel69    时间: 2013-11-21 21:52
再短一点
  1. perl -F, -lape '$_=$_.",".++$h{$F[2]}'
复制代码
回复 10# yestreenstars


   
作者: yestreenstars    时间: 2013-11-21 21:58
回复 12# kernel69
再短一些,问题也不大~
  1. perl -F, -lape ' $_.=",".++$h{$F[2]}'
复制代码

作者: kernel69    时间: 2013-11-21 23:03
赞个

回复 13# yestreenstars


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2