Chinaunix

标题: awk 去重 rs的问题 [打印本页]

作者: idvicki    时间: 2014-10-14 17:17
标题: awk 去重 rs的问题
有逗号分隔的字符串,需要去重.
awk设置RS为逗号,结果ms有问题

另外,如果需要在shell中把字符串去重之后转为数组,需要如何写? 谢谢

# cat pattern.txt
hello,hello
# awk -v RS=","  '!a[$0]++' pattern.txt
hello
hello
#还有额外一行
# sed 's/,/\n/g' pattern.txt | awk '!a[$0]++'
hello


# cat pattern.txt
hello,hello,world
# awk -v RS=","  '!a[$0]++' pattern.txt
hello
world
#还有额外一行
# sed 's/,/\n/g' pattern.txt | awk '!a[$0]++'
hello
world
作者: reyleon    时间: 2014-10-14 17:46
echo hello,hello


因为 echo 会带一个回车符... 如果将 RS设成逗号.

则记录变成了:

hello //第一条记录
hello\n //第二条记录

!a[$0]++ 时自然没法去重..

try:

echo -n hello,hello | awk -v RS=","  '!a[$0]++'
作者: jason680    时间: 2014-10-14 18:30
回复 1# idvicki


$ awk -vRS=",|\n" '!a[$0]++&&NF' pattern.txt
hello

   
作者: yestreenstars    时间: 2014-10-14 19:54
当你把RS设成逗号时,行尾的换行符就变成普通字符了,所以会打印出来~{:3_193:}
作者: idvicki    时间: 2014-10-14 20:48
谢谢各位,逗号分隔符的问题明白了,

还想请教一下, pattern.txt里面只有一行,应该是 hello,helloEOF才对啊,为何最后会有一个回车?
作者: yestreenstars    时间: 2014-10-14 21:08
回复 5# idvicki

没回车就不正常了~{:3_193:}
   
作者: idvicki    时间: 2014-10-14 21:13
本帖最后由 idvicki 于 2014-10-14 21:15 编辑

回复 6# yestreenstars

是说awk会在最后加一个换行符么? pattern.txt里面并没有换行符


   
作者: yestreenstars    时间: 2014-10-14 22:35
回复 7# idvicki

孩纸,我决定用实际行动告诉你有换行符和没换行符的区别~{:3_193:}
  1. [root@localhost ~]# echo -n 'hello,hello' > i
  2. [root@localhost ~]# awk -v RS=","  '!a[$0]++' i
  3. hello
  4. [root@localhost ~]# echo 'hello,hello' > i
  5. [root@localhost ~]# awk -v RS=","  '!a[$0]++' i
  6. hello
  7. hello

  8. [root@localhost ~]#
复制代码

作者: jason680    时间: 2014-10-14 22:38
回复 7# idvicki

dump your file and see the newline("\n", 0x0a)

$ cat  pattern.txt
hello,hello,world
$ hexdump -C pattern.txt
00000000  68 65 6c 6c 6f 2c 68 65  6c 6c 6f 2c 77 6f 72 6c  |hello,hello,worl|
00000010  64 0a                                             |d.|
00000012

   
作者: 李满满    时间: 2014-10-14 22:58
学生党:无聊~python试试set去重
$ python
Python 2.7.8 (default, Jul 25 2014, 14:04:36)
[GCC 4.8.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> s='hello,hello,world'
>>> set(s.split(','))
set(['world', 'hello'])

作者: idvicki    时间: 2014-10-15 09:12
回复 8# yestreenstars

多谢!


   
作者: idvicki    时间: 2014-10-15 09:16
回复 9# jason680

多谢,明白了,我原来是 echo hello,hello > pattern.txt 的, vim -b 打开之后没有 %!xxd 转成16进制显示,所以一直没看到那个换行,改用echo -n就好了.

   




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