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啦~
[root@localhost ~]# awk -F, '{print $0","++a[$3]}' i
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
[root@localhost ~]# cat i
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
[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
awk -F, '{c[$3]++;print $0","c[$3]}'
复制代码
作者:
Shell_HAT
时间:
2013-11-20 16:55
awk 'BEGIN{FS=OFS=","}{print $0,++a[$3]}' urfile
复制代码
作者:
qooweds
时间:
2013-11-20 16:57
感谢大家!
懂了!
数组好方便
作者:
reyleon
时间:
2013-11-20 17:07
awk 'BEGIN{FS=OFS=","}{print $0,++a[$3]}'
复制代码
作者:
这个冬天不冷
时间:
2013-11-20 17:08
awk -F, '{a[$3]++;print $0,a[$3]}' 1
复制代码
作者:
kernel69
时间:
2013-11-21 21:28
来个perl的
perl -F',' -lane 'print "$_,$h{$F[2]}" if ++$h{$F[2]}'
复制代码
回复
1#
qooweds
作者:
yestreenstars
时间:
2013-11-21 21:45
回复
9#
kernel69
可以更短些:
perl -F, -lane 'print $_.",".++$h{$F[2]}'
复制代码
作者:
kernel69
时间:
2013-11-21 21:49
妙啊
回复
10#
yestreenstars
作者:
kernel69
时间:
2013-11-21 21:52
再短一点
perl -F, -lape '$_=$_.",".++$h{$F[2]}'
复制代码
回复
10#
yestreenstars
作者:
yestreenstars
时间:
2013-11-21 21:58
回复
12#
kernel69
再短一些,问题也不大~
perl -F, -lape ' $_.=",".++$h{$F[2]}'
复制代码
作者:
kernel69
时间:
2013-11-21 23:03
赞个
回复
13#
yestreenstars
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2