Chinaunix

标题: awk 根据某列去重求助。 [打印本页]

作者: 啵啵油菜    时间: 2014-10-14 11:46
标题: awk 根据某列去重求助。
需要根据文件中的某列进行取重,只取最后一条数据。求助啊 各位大神们

100001 I
100001 U
100001 D
200001 I
300000 U
200001 D
300000 D
400000  I
400000  U

需要得到的结果为

100001 D
200001 D
300000 D
400000  U

自己写了一个无法实现
作者: 这个冬天不冷    时间: 2014-10-14 11:58
  1. [root@localhost ~]# awk '{a[$1]=$0}END{for(i in a)print a[i]}' file1 | sort
  2. 100001 D
  3. 200001 D
  4. 300000 D
  5. 400000  U
  6. [root@localhost ~]# cat file1
  7. 100001 I
  8. 100001 U
  9. 100001 D
  10. 200001 I
  11. 300000 U
  12. 200001 D
  13. 300000 D
  14. 400000  I
  15. 400000  U
复制代码

作者: jason680    时间: 2014-10-14 11:59
回复 1# 啵啵油菜

$ awk '{if(!a[$1])c[++t]=$1;a[$1]=$0}END{for(n=1;n<=t;n++)print a[c[n]]}' FILE
100001 D
200001 D
300000 D
400000  U

   
作者: 啵啵油菜    时间: 2014-10-14 13:47
求大神,给解释一下!回复 3# jason680


   
作者: jason680    时间: 2014-10-14 14:00
回复 4# 啵啵油菜

方法:后来居上

use array in AWK and wirte over the value

refer more detail as below if you didn't know the AWK script

awk数组的学习心得
http://bbs.chinaunix.net/forum.p ... mp;fromuid=24785593

文本编辑的一点心得--awk篇
http://bbs.chinaunix.net/forum.p ... mp;fromuid=24785593

   
作者: bulletmarquis    时间: 2014-10-14 14:41
回复 1# 啵啵油菜


    不考验顺序的话简单一点,只按第一列取最后一行:
  1. awk '{a[$1]=$0}END{for(i in a)print a[i]}' file
复制代码

作者: jcdiy0601    时间: 2014-10-14 15:05
  1. awk '{a[$1]=$0}END{len=asort(a);for(i=1;i<=len;i++)print a[i]}' test
  2. 100001 D
  3. 200001 D
  4. 300000 D
  5. 400000  U
复制代码

作者: 啵啵油菜    时间: 2014-10-14 15:20
谢谢了。回复 6# bulletmarquis


   
作者: 啵啵油菜    时间: 2014-10-14 15:20
谢谢 回复 7# jcdiy0601


   
作者: heyong45    时间: 2014-10-14 17:43
假设数据在filename中,
# sort -n -k 1 -s filename |tac|sort -n -k 1 -s -u
结果:
100001 D
200001 D
300000 D
400000  U

作者: aingwen    时间: 2014-10-14 19:52
  1. cat file|tac|awk '!a[$1]++'|tac
复制代码





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