免费注册 查看新帖 |

Chinaunix

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

如何用awk按组合关键字删除重复行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-19 12:55 |只看该作者 |正序浏览
本帖最后由 useinxinuanihc 于 2010-05-21 16:49 编辑

urfile 文件如下
PBCSPOFT0101    0
PBCSPOFT0101    96
PBCSPOFT0102    0
PBCSPOFT0102    6
PBCSPOFT0103    0
PBCSPOFT0103    8
PBCSPOFT0104    0
PBCSPOFT0105    0
PBCSPOFT0106    0
PBCSPOFT0107    0
PBCSPOFT0107    10
PBCSPOFT0108    0
我想删除第一个字段重复的且第二个字段为0的行,结果应该如下
PBCSPOFT0101    96
PBCSPOFT0102    6
PBCSPOFT0103    8
PBCSPOFT0104    0
PBCSPOFT0105    0
PBCSPOFT0106    0
PBCSPOFT0107    10
PBCSPOFT0108    0

学习后,对黑哥的解决思路的分析,分享给大家,感谢朋友们的回答!!!

awk 'NR==FNR{a[$1]++;next}$2!=0||a[$1]==1' urfile urfile
     |--^--| |--^--| |-^| |-^-|  |-^-----| |--^-| ---^--
        |       |      |  | |      |          |      |_第2次读数据文件
        |       |      |  | |      |          |_第1次读数据文件
        |       |      |  | |      |_以第一个字段为下标的数组的值为1,
        |       |      |  | |        即本行的第一个字段的值在数据文件中
        |       |      |  | |        是唯一的,这时也执行打印数据的默认
        |       |      |  | |        操作
        |       |      |  | |_第2个字段的值不是0时执行打印数据的默认操作
        |       |      |  |-----^--------|
        |       |      |        |_此时NR!=FNR,即第2次读数据文件时,本判断
        |       |      |          才开始起起作用
        |       |      |_到下一行,本行记录后面的匹配都被忽略掉,这个很重
        |       |        要,因为没有的话后面的匹配会被执行。
        |       |_以第一个字段为下标的数组记录每一个第一个字段值相同的行
        |         数,例如第一个字段值为 PBCSPOFT0107 的记录行数为2,那么
        |         a[PBCSPOFT0107]的值就为2,第一个字段值为 PBCSPOFT0106
        |         的记录行数为1,那么a[PBCSPOFT0106]的值就为1.
        |_NR:awk开始执行程序后所读取的数据行数
          FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计

论坛徽章:
0
48 [报告]
发表于 2010-07-28 17:08 |只看该作者
aiji_118.M   d0155049656e5c1796820e05e00ce445 *
aiji_130.Ma 254508b6df6bfa20a641f3f339dfdf98 *
aiji_130.M   fa015b1abb23c53810822dafb482be91 *
aiji_130.M   fa015b1abb23c53810822dafb482be91 *

呃,同样的问题,想去掉第二列是重复的,貌似执行没结果。。。

cat max.md5 | awk '{a[$2]++;next}a[$2]==1 {print $0}'

论坛徽章:
0
47 [报告]
发表于 2010-06-30 10:58 |只看该作者
跟楼上差不多

awk '{a[$1]=$2;}END{for(i in a){if (a[i]!=0){print i,a[i];}else{print i,0;}}}' urfile630
PBCSPOFT0101 96
PBCSPOFT0102 6
PBCSPOFT0103 8
PBCSPOFT0104 0
PBCSPOFT0105 0
PBCSPOFT0106 0
PBCSPOFT0107 10
PBCSPOFT0108 0

论坛徽章:
0
46 [报告]
发表于 2010-05-27 15:47 |只看该作者
awk '{a[$1]=(a[$1]+$2)} END {for(b in a)print b,a[b]}' file

论坛徽章:
0
45 [报告]
发表于 2010-05-25 11:59 |只看该作者
学习了,支持这种分析,谢谢

论坛徽章:
0
44 [报告]
发表于 2010-05-23 18:40 |只看该作者
mark 回去慢慢研究

论坛徽章:
0
43 [报告]
发表于 2010-05-21 22:54 |只看该作者

论坛徽章:
0
42 [报告]
发表于 2010-05-21 16:50 |只看该作者
回复 41# bbgg1983


    呵呵,学习顺便给大家分享嘛 也算是对朋友们的答谢啦

论坛徽章:
0
41 [报告]
发表于 2010-05-21 16:40 |只看该作者
回复 39# useinxinuanihc


    牛人,打这个得需要不少时间吧?

论坛徽章:
0
40 [报告]
发表于 2010-05-21 16:38 |只看该作者
urfile 文件如下
PBCSPOFT0101    0
PBCSPOFT0101    96
PBCSPOFT0102    0
PBCSPOFT0102    6
PBCSPOFT0103    0
PBCSPOFT0103    8
PBCSPOFT0104    0
PBCSPOFT0105    0
PBCSPOFT0106    0
PBCSPOFT0107    0
PBCSPOFT0107    10
PBCSPOFT0108    0

实现目的的awk语句分析如下
awk 'NR==FNR{a[$1]++;next}$2!=0||a[$1]==1' urfile urfile
     |--^--| |--^--| |-^| |-^-|  |-^-----| |--^-| ---^--
        |       |      |  | |      |          |      |_第2次读数据文件
        |       |      |  | |      |          |_第1次读数据文件
        |       |      |  | |      |_以第一个字段为下标的数组的值为1,
        |       |      |  | |        即本行的第一个字段的值在数据文件中
        |       |      |  | |        是唯一的,这时也执行打印数据的默认
        |       |      |  | |        操作
        |       |      |  | |_第2个字段的值不是0时执行打印数据的默认操作
        |       |      |  |-----^--------|
        |       |      |        |_此时NR!=FNR,即第2次读数据文件时,本判断
        |       |      |          才开始起起作用
        |       |      |_到下一行,本行记录后面的匹配都被忽略掉,这个很重
        |       |        要,因为没有的话后面的匹配会被执行。
        |       |_以第一个字段为下标的数组记录每一个第一个字段值相同的行
        |         数,例如第一个字段值为 PBCSPOFT0107 的记录行数为2,那么
        |         a[PBCSPOFT0107]的值就为2,第一个字段值为 PBCSPOFT0106
        |         的记录行数为1,那么a[PBCSPOFT0106]的值就为1.
        |_NR:awk开始执行程序后所读取的数据行数
          FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP