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
展开
 我来答
searchsprit
推荐于2016-09-06 · TA获得超过111个赞
知道小有建树答主
回答量:136
采纳率:100%
帮助的人:130万
展开全部
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值是输出可能是乱序的
追问
awk处理的时候是逐行扫描的吧,  hash到相同的字符串的时候是不是就当同一个key来处理?
如扫描第一行得到S[Tom], 扫描到第四行的时候又是S[Tom], 2个元素是相同的.
追答
1 是逐行
2 hash的Key值是唯一的, 同一个Key会被后来的覆盖
3 同2,Key被覆盖了
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式