免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3439 | 回复: 15
打印 上一主题 下一主题

[文本处理] awk 排重 求助啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-08 19:56 |只看该作者 |倒序浏览
现在有一个文件 内容为:
   1;2;3;4;5
   1;2;3;5;5
   1;2;3;4;2
   1;3;3;1;5
现在要求生成一个新的文件 如果一个竖排数字都相同就不变 如果不相同,就写入一个空格 生成文件如下
   1; ;3; ; ;
应该怎么弄啊 求助啊

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2013-11-08 20:22 |只看该作者

没测试
awk -F; '{for(i=1;i<=NF;i++){a[NF][b[i]=$i]++}}END{for(i=1;i<=NF;i++){printf a[i][b[i]]==NR?b[i]:" ";printf i==NF?"":";"};print ""}' file

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2013-11-08 20:30 |只看该作者
  1. [root@localhost ~]# cat i
  2. 1;2;3;4;5
  3. 1;2;3;5;5
  4. 1;2;3;4;2
  5. 1;3;3;1;5
  6. [root@localhost ~]# awk 'BEGIN{FS=OFS=";"}{for(i=1;i<=NF;i++)a[i,$i]++}END{for(i=1;i<=NF;i++)if(a[i,$i]<NR)$i=" ";print}' i
  7. 1; ;3; ;
  8. [root@localhost ~]#
复制代码
你的结果是不是多了一个分号?

论坛徽章:
0
4 [报告]
发表于 2013-11-08 20:39 |只看该作者
回复 3# yestreenstars


    是啊啊 哈哈 麻烦能简单解释一下吗

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2013-11-08 20:47 |只看该作者
回复 4# genius04121
  1. awk 'BEGIN{FS=OFS=";"} #将输入、输出字段分隔符都设为分号
  2. {for(i=1;i<=NF;i++)a[i,$i]++} #遍历每个字段,以该字段的序号和该字段为下标建立数组a,以确保唯一性,每重复一次值增加1
  3. END{for(i=1;i<=NF;i++)if(a[i,$i]<NR)$i=" ";print}' #在文件末尾,遍历每个字段,如果该字段重复的个数比总行数小则设为空格,最后打印结果
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2013-11-08 20:54 |只看该作者
本帖最后由 yestreenstars 于 2013-11-08 21:28 编辑

提供多一个版本:
  1. [root@localhost ~]# awk 'BEGIN{FS=OFS=";"}{for(i=1;i<=NF;i++){if(a[i]!=""&&$i!=a[i])$i=" ";a[i]=$i}}END{print}' i
  2. 1; ;3; ;
  3. [root@localhost ~]#
复制代码

论坛徽章:
0
7
发表于 2013-11-08 20:59
回复 6# yestreenstars


    还能问下吗 如果最后一列 不排重 而是进行求和 能实现吗

论坛徽章:
0
8
发表于 2013-11-08 21:00
回复 6# yestreenstars


    1; ;3; ;17  就是这个效果

论坛徽章:
0
9
发表于 2013-11-08 21:00
回复 6# yestreenstars


    1; ;3; ;17  就是这个效果

论坛徽章:
0
10 [报告]
发表于 2013-11-08 21:01 |只看该作者
awk -F';' '{b++;for(i=1;i<NF+1;i++){a[i]+=$i}}END{for (x=1;x<FNR+1;x++){if (length(a[x]/b)==1) {printf a[x]/b";"} else{printf " ;"} }}'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP