Chinaunix

标题: [已解决]求助,如何删除特定位置出现重复字符的行 [打印本页]

作者: _伊飞_    时间: 2014-08-15 09:32
标题: [已解决]求助,如何删除特定位置出现重复字符的行
本帖最后由 _伊飞_ 于 2014-08-15 10:20 编辑

大家好。
现有如下所示的文件,其中第三列是一些特定的字符串(最多3位,位置在第14-16个字符,如果是三个字母的话,和后面第四列之间就没有空格),第六列是一列数字(最多3位,位置在第24-26个字符,和前面第五列之间有空格),现在要做如下处理:
对于第六列数字相同的行,如果第三列中的字符串重复出现,则保留第一次出现的行,重复出现的行都删掉。比如在这个文本中,应删掉倒数两行和倒数第四行,其它的全部保留。
谢谢大虾帮忙!
xxxx     xx  A   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  B   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  C   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  D   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  AB  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  BC  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  CD  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  EFG xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  LMN xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  A  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  B  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  C  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  D  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  A  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  B  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  C  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  D  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  AB xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  CD xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  AB xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
作者: 关阴月飞    时间: 2014-08-15 09:53
  1. awk '{a=length($3)>3?substr($3,1,3)$5:$3$6}!b[a]++'  urfile
复制代码

作者: lifayi2008    时间: 2014-08-15 09:54
是否所有列都是按tab对齐的?
作者: _伊飞_    时间: 2014-08-15 09:57
回复 2# 关阴月飞

谢谢,但是不能执行,提示这个呢
b[a]++: Event not found.
   
作者: Buring__    时间: 2014-08-15 09:58
  1. cat urfile
  2.    xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  3. xxxx     xx  B   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  4. xxxx     xx  C   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  5. xxxx     xx  D   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  6. xxxx     xx  AB  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  7. xxxx     xx  BC  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  8. xxxx     xx  CD  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  9. xxxx     xx  EFG xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  10. xxxx     xx  LMN xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  11. xxxx     xx  A  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  12. xxxx     xx  B  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  13. xxxx     xx  C  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  14. xxxx     xx  D  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  15. xxxx     xx  A  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  16. xxxx     xx  B  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  17. xxxx     xx  C  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  18. xxxx     xx  D  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  19. xxxx     xx  AB xxxx x  10      xxxxxx  xxxxxx  xxxxxx  1
  20. xxxx     xx  CD xxxx x  10      xxxxxx  xxxxxx  xxxxxx  2
  21. xxxx     xx  AB xxxx x  10      xxxxxx  xxxxxx  xxxxxx  3
  22. xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  4
  23. xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  5
  24. xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  6
  25. $ awk '{a=substr($0,14,3);b=substr($0,25,2)};!c[b,a]++' urfile
  26.    xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  27. xxxx     xx  B   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  28. xxxx     xx  C   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  29. xxxx     xx  D   xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  30. xxxx     xx  AB  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  31. xxxx     xx  BC  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  32. xxxx     xx  CD  xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  33. xxxx     xx  EFG xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  34. xxxx     xx  LMN xxx x   8      xxxxxx  xxxxxx  xxxxxx  x
  35. xxxx     xx  A  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  36. xxxx     xx  B  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  37. xxxx     xx  C  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  38. xxxx     xx  D  xxxx x   9      xxxxxx  xxxxxx  xxxxxx  x
  39. xxxx     xx  A  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  40. xxxx     xx  B  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  41. xxxx     xx  C  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  42. xxxx     xx  D  xxxx x  10      xxxxxx  xxxxxx  xxxxxx  x
  43. xxxx     xx  AB xxxx x  10      xxxxxx  xxxxxx  xxxxxx  1
  44. xxxx     xx  CD xxxx x  10      xxxxxx  xxxxxx  xxxxxx  2
  45. xxxx     xx  ABCxxxx x  10      xxxxxx  xxxxxx  xxxxxx  4
复制代码

作者: _伊飞_    时间: 2014-08-15 09:59
回复 3# lifayi2008

不是tab,都是用空格,每列占的字符数是固定的,不够的就用空格补齐,是对齐的。
   
作者: blackold    时间: 2014-08-15 10:01
  1. awk '!a[substr($0,24,3),substr($0,14,3)]++' urfile
复制代码

作者: q1208c    时间: 2014-08-15 10:07
回复 7# blackold

这个应该是比例合适的, 因为楼主的文件其实不是严格分列的.
   
作者: blackold    时间: 2014-08-15 10:10
回复 1# _伊飞_


    其实就是去除"第3列""第6列"重复的行。
作者: _伊飞_    时间: 2014-08-15 10:10
回复 7# blackold


谢谢你,但是也是提示跟前面类似的问题
a[substr: Event not found.   
作者: blackold    时间: 2014-08-15 10:11
回复 10# _伊飞_


    历史命令替换了。你用的是什么csh吧?
作者: blackold    时间: 2014-08-15 10:14
csh 类 shell:
  1. awk '\!a[substr($0,14,3),substr($0,24,3)]++' urfile
复制代码

作者: _伊飞_    时间: 2014-08-15 10:17
回复 12# blackold


可以了!谢谢大虾,非常感谢!
作者: _伊飞_    时间: 2014-08-15 10:18
问题解决,感谢以上诸位的帮忙 O(∩_∩)O~
作者: blackold    时间: 2014-08-15 10:28
本帖最后由 blackold 于 2014-08-15 10:28 编辑

更方便、通用的写法
  1. awk '! a[substr($0,14,3),substr($0,24,3)]++' urfile
复制代码
csh 类 shell, bourne 类 shell, 通杀。
作者: _伊飞_    时间: 2014-08-15 10:33
回复 15# blackold


果然也可以,谢谢赐教
作者: 关阴月飞    时间: 2014-08-15 10:43
回复 4# _伊飞_


    你的系统环境是? awk版本是? 还有你是如何执行的?
作者: fxpbupt    时间: 2014-08-15 10:44
awk '(c=$0)&&NF==9{a=substr($3,1,3);$4=substr($3,4);$3=a;}!b[$3$6]++{print c}'  urfile

作者: klainogn    时间: 2014-08-15 13:27
  1. awk -vFIELDWIDTHS="13 3 8 3" '!a[$2,$4]++' urfile
复制代码





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