test.txt文件如下.执行该命令cat test.txt | awk '{S[$1]}{for(i in S) print i}'为何会有如下结果?
oam@GDYG-WE-OAM:~>moretest.txtTom2012-12-11car53000John2013-01-13bike41000vivi2013-01...
oam@GDYG-WE-OAM:~> more test.txt
Tom 2012-12-11 car 53000
John 2013-01-13 bike 41000
vivi 2013-01-18 car 42800
Tom 2013-01-20 car 32500
John 2013-01-28 bike 63500
结果:不加END为什么会有这么多,每一个是怎么出来的?
oam@GDYG-WE-OAM:~> cat test.txt | awk '{S[$1]}{for(i in S) print i}'
Tom
Tom
John
Tom
vivi
John
Tom
vivi
John
Tom
vivi
John
添加END之后 为什么会变成3个
cat test.txt | awk '{S[$1]}END{for(i in S) print i}'
结果
Tom
John
vivi 展开
Tom 2012-12-11 car 53000
John 2013-01-13 bike 41000
vivi 2013-01-18 car 42800
Tom 2013-01-20 car 32500
John 2013-01-28 bike 63500
结果:不加END为什么会有这么多,每一个是怎么出来的?
oam@GDYG-WE-OAM:~> cat test.txt | awk '{S[$1]}{for(i in S) print i}'
Tom
Tom
John
Tom
vivi
John
Tom
vivi
John
Tom
vivi
John
添加END之后 为什么会变成3个
cat test.txt | awk '{S[$1]}END{for(i in S) print i}'
结果
Tom
John
vivi 展开
1个回答
展开全部
cat test.txt | awk '{S[$1]}{for(i in S) print NR,i; print"\n"}'
1 Tom
2 Tom
2 John
3 vivi
3 Tom
3 John
4 vivi
4 Tom
4 John
5 vivi
5 Tom
5 John
这样你明白吗? END是处理完了之后输出. 不加的话,每hash一个Key值就输出一次. 第一列是行号. 也就是到第3行的时候, hash的Key值已经有3个了.
加END的结果就是排重. 还有一点,hash的Key值是输出可能是乱序的
1 Tom
2 Tom
2 John
3 vivi
3 Tom
3 John
4 vivi
4 Tom
4 John
5 vivi
5 Tom
5 John
这样你明白吗? END是处理完了之后输出. 不加的话,每hash一个Key值就输出一次. 第一列是行号. 也就是到第3行的时候, hash的Key值已经有3个了.
加END的结果就是排重. 还有一点,hash的Key值是输出可能是乱序的
追问
awk处理的时候是逐行扫描的吧, hash到相同的字符串的时候是不是就当同一个key来处理?
如扫描第一行得到S[Tom], 扫描到第四行的时候又是S[Tom], 2个元素是相同的.
追答
1 是逐行
2 hash的Key值是唯一的, 同一个Key会被后来的覆盖
3 同2,Key被覆盖了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询