Chinaunix

标题: 昨天去腾讯现场招聘会,一上来就被问闷了。 [打印本页]

作者: xinxin12375    时间: 2009-03-01 20:26
标题: 昨天去腾讯现场招聘会,一上来就被问闷了。
本人毕业不到一年,在Linux下也没什么经验,以前在学校基本上没接触过linux,不过以后想在linux下发展,于是就去应聘Linux下的搜索工程师,简历上写了熟悉shell编程(呵呵,其实只是勉强知道一些),结果面试官一上来就出了一个题,大致是这样的:有一个文件是QQ号到手机号的绑定关系,一行一个关系,格式如下:11235334:13443253456。然后统计出每个QQ绑定了几个手机,输出到一个文件里。格式如下
:[11235334]
13454543454
13643543544
[23432423]
13654645542

结果一下子就闷了,后来的问题也就没什么意义了,真是失败,看来现在要恶补了,哪位哥们帮忙解答一下上面的问题,随便给点意见,我选择Linux是不是一个错误???
作者: 我是DBA    时间: 2009-03-01 20:40
[test@erpdataserver ~]$ awk -v RS='[' '$1=$1{print "["$1,(NF-1)}' 1
[11235334] 2
[23432423] 1
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542
作者: leetaedong    时间: 2009-03-01 20:42
腾讯 吧?

这个问的很基础的. 不难.  可以用awk 做.
作者: haimming    时间: 2009-03-01 20:45
不用awk,也行
tac urfile |while read line;do if [[ "$line" =~ "\[[0-9]*\]" ]] ;then echo "$line $count";count=0;else ((count++));fi;done

[ 本帖最后由 haimming 于 2009-3-1 21:31 编辑 ]
作者: ztj2247    时间: 2009-03-01 20:46
原帖由 我是DBA 于 2009-3-1 20:40 发表
[test@erpdataserver ~]$ awk -v RS='[' '$1=$1{print "["$1,(NF-1)}' 1
[11235334] 2
[23432423] 1
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542



能解释一下吗?
作者: 我是DBA    时间: 2009-03-01 20:48
标题: 回复 #4 haimming 的帖子
兄弟测试过没有
作者: 我是DBA    时间: 2009-03-01 20:50
标题: 回复 #5 ztj2247 的帖子
以[为记录分隔符,打印出QQ号码以及手机号码个数。
作者: blackold    时间: 2009-03-01 20:51
标题: 回复 #1 xinxin12375 的帖子
没有统计具体个数:
  1. awk -F : '{a[$1]=a[$1]"\n"$2}END{for ( i in a ) print "["i"]"a[i]}' urife
复制代码

输出为:
[11235334]
13443253457
13443253456
13443253456
13443253456
13443253456
13443253456
13443253456
13443253456
[11235335]
13443253456
13443253456
13443253459
13443253456
13443253456
13443253456
13443253456
13443253456

作者: haimming    时间: 2009-03-01 20:58
标题: 回复 #6 我是DBA 的帖子
只依LZ的做过,没有再考虑复杂的
[rockfall@tmp]$cat urfile2
[11235334]
13454543454
13643543544
[23432423]
13654645542
[rockfall@tmp]$tac urfile2 |while read line;do if [[ $line =~ "\[[0-9]*\]" ]] ;then echo $line $count;count=0;else ((count++));fi;done
[23432423] 1
[11235334] 2

作者: 我是DBA    时间: 2009-03-01 21:02
标题: 回复 #9 haimming 的帖子
你用你的测试不行。
作者: 我是DBA    时间: 2009-03-01 21:04
原帖由 haimming 于 2009-3-1 20:58 发表
只依LZ的做过,没有再考虑复杂的

[test@erpdataserver ~]$ sh -x sh.sh
+ tac 1
+ read line
+ [[ 13654645542 =~ \[[0-9]*\] ]]
+ (( count++ ))
+ read line
+ [[ [23432423] =~ \[[0-9]*\] ]]
+ echo 2 3 1
2 3 1
+ count=0
+ read line
+ [[ 13643543544 =~ \[[0-9]*\] ]]
+ (( count++ ))
+ read line
+ [[ 13454543454 =~ \[[0-9]*\] ]]
+ (( count++ ))
+ read line
+ [[ [11235334] =~ \[[0-9]*\] ]]
+ echo 1 2 3 2
1 2 3 2
+ count=0
+ read line
[test@erpdataserver ~]$ cat sh.sh
tac 1 |while read line;do if [[ $line =~ "\[[0-9]*\]" ]] ;then echo $line $count;count=0;else ((count++));fi;done
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542

[test@erpdataserver ~]$ tac 1 |while read line;do if [[ $line =~ "\[[0-9]*\]" ]] ;then echo $line $count;count=0;else ((count++));f
i;done
2 3 1
1 2 3 2
作者: cnzhaopeng    时间: 2009-03-01 21:07
原帖由 我是DBA 于 2009-3-1 20:40 发表
[test@erpdataserver ~]$ awk -v RS='[' '$1=$1{print "["$1,(NF-1)}' 1
[11235334] 2
[23432423] 1
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542



lz说的应该是从11235334:13443253456   形式的文件得到:
这种格式文件如下
:[11235334]
13454543454
13643543544
[23432423]
13654645542
好像你直接用结果文件了吧?
作者: 剑侠客123    时间: 2009-03-01 21:08
我看不懂了这个了啊
作者: haimming    时间: 2009-03-01 21:13
标题: 回复 #10 我是DBA 的帖子
不明白,是不是“我用你的测试不行啊”?
怎么不行了?贴来looklook

来个sed吧,大家都用awk
sed -r ':a;N;s/(.*)\n[^\[]*/\1\n/;ta;' urfile2|uniq -c|sed -r 'N;s/[ ]*[0-9]* ([^ ]*)\n[ ]*([^ ]*)/\1 \2/'
作者: 我是DBA    时间: 2009-03-01 21:16
标题: 回复 #14 haimming 的帖子
做不半天,理解错楼主意思了,我不是有贴出来啊
作者: ztj2247    时间: 2009-03-01 21:21
原帖由 我是DBA 于 2009-3-1 20:40 发表
[test@erpdataserver ~]$ awk -v RS='[' '$1=$1{print "["$1,(NF-1)}' 1
[11235334] 2
[23432423] 1
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542


$1=$1 是什么意思呀 还有awk -v 虾米意思呀
作者: yuhongchun    时间: 2009-03-01 21:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: 我是DBA    时间: 2009-03-01 21:27
标题: 回复 #16 ztj2247 的帖子
$1=$1赋值啊,
-v设置变量
作者: ztj2247    时间: 2009-03-01 21:29
原帖由 我是DBA 于 2009-3-1 21:27 发表
$1=$1赋值啊,
-v设置变量


$1=$1 解释下嘛 我琢磨了半天 还是没明白$1=$1到底有虾米用
拜托啦
作者: haimming    时间: 2009-03-01 21:31
标题: 回复 #15 我是DBA 的帖子
谢谢指教!
见鬼了,我只能说,第一二三都可以,但把文件名改成了1之后就再也不行了,这个现象让我不得其解,

不过,这句是有些要注意的,又是引号惹的祸
已经改过来了
作者: 我是DBA    时间: 2009-03-01 21:40
标题: 回复 #19 ztj2247 的帖子
重置输出分隔符
给你个例子吧
[test@erpdataserver ~]$ cat 1
1 2          3  4
a a a  5 2             7
[test@erpdataserver ~]$ awk '$1=$1' 1
1 2 3 4
a a a 5 2 7
作者: 我是DBA    时间: 2009-03-01 21:41
标题: 回复 #20 haimming 的帖子
不知道你怎么可以的,我咋搞都不行,现在改过的就可以了,不过我们理解错楼主的意思了。不是要这样搞。
作者: ztj2247    时间: 2009-03-01 21:47
原帖由 我是DBA 于 2009-3-1 21:40 发表
重置输出分隔符
给你个例子吧
[test@erpdataserver ~]$ cat 1
1 2          3  4
a a a  5 2             7
[test@erpdataserver ~]$ awk '$1=$1' 1
1 2 3 4
a a a 5 2 7


是把所有的空格 都删除的意思吗?
作者: blackold    时间: 2009-03-01 21:52
原帖由 我是DBA 于 2009-3-1 21:40 发表
重置输出分隔符
给你个例子吧
[test@erpdataserver ~]$ cat 1
1 2          3  4
a a a  5 2             7
[test@erpdataserver ~]$ awk '$1=$1' 1
1 2 3 4
a a a 5 2 7


试试如下内容:
1 2          3  4
0 2          3  4
a a a  5 2             7


这个贴子让我心痛。

[ 本帖最后由 blackold 于 2009-3-1 21:53 编辑 ]
作者: haimming    时间: 2009-03-01 21:53
标题: 回复 #22 我是DBA 的帖子
幸好我是复杂粘贴的,不然,我自己都要怀疑我的眼睛了
作者: haimming    时间: 2009-03-01 21:57
原帖由 blackold 于 2009-3-1 21:52 发表


试试如下内容:


这个贴子让我心痛。


  1. [rockfall@tmp]$awk '$1=$1' kkkk
  2. 1 2 3 4
  3. a a a 5 2 7
  4. [rockfall@tmp]$cat kkkk
  5. 1 2          3  4
  6. 0 2          3  4
  7. a a a  5 2             7
  8. [rockfall@tmp]$

复制代码

0开头的行不见 了
作者: 我是DBA    时间: 2009-03-01 21:57
标题: 回复 #24 blackold 的帖子
黑哥指教的是,知错了。
作者: ztj2247    时间: 2009-03-01 21:59
原帖由 blackold 于 2009-3-1 21:52 发表


试试如下内容:


这个贴子让我心痛。


黑哥 试你的这个 怎么第2行没了阿?
作者: 我是DBA    时间: 2009-03-01 22:01
看来还得跟黑哥好好学习
作者: haimming    时间: 2009-03-01 22:01
标题: 回复 #27 我是DBA 的帖子
为什么?
作者: ztj2247    时间: 2009-03-01 22:02
原帖由 我是DBA 于 2009-3-1 22:01 发表
看来还得跟黑哥好好学习

快告诉我下吧。。明天还要上班挖。。>_<``  $1=$1  好深奥阿
作者: 我是DBA    时间: 2009-03-01 22:03
标题: 回复 #30 haimming 的帖子
因为0 默认就不打印了。
作者: 我是DBA    时间: 2009-03-01 22:04
标题: 回复 #31 ztj2247 的帖子
用$1=$1不行
那就换成$2=2
再不行换成$3=$3
换到行为止。
作者: ztj2247    时间: 2009-03-01 22:05
原帖由 我是DBA 于 2009-3-1 22:03 发表
因为0 默认就不打印了。

那是不是 第1欲为 0的 就不打印了 而且把所有的 空格都替换为一个空格?
作者: blackold    时间: 2009-03-01 22:07
标题: 回复 #28 ztj2247 的帖子
在许多语言中,赋值语句($1=value)的真值由所赋的值决定。

在这个例子中,当value为0或者空字符串""时,值为false,不执行默认的action(print $0)。

在awk中$1=value如" 我是DBA" 所说,还在其它的“副作用”。

以上是我个人理解,没有仔细查阅过awk手册,仅供参考。
作者: haimming    时间: 2009-03-01 22:08
标题: 回复 #32 我是DBA 的帖子
thx,如果想$1=0呢?
作者: Lx308033262    时间: 2009-03-01 22:10
'$1=$1'在这里是不是对齐的意思?
作者: ztj2247    时间: 2009-03-01 22:11
原帖由 blackold 于 2009-3-1 22:07 发表
在许多语言中,赋值语句($1=value)的真值由所赋的值决定。

在这个例子中,当value为0或者空字符串""时,值为false,不执行默认的action(print $0)。

在awk中$1=value如" 我是DBA" 所说,还在其它的“副作 ...


原来如此 那 $1=$1在刚才中是充当for 语句进行后面action的循环吧?
作者: blackold    时间: 2009-03-01 22:15
原帖由 我是DBA 于 2009-3-1 21:57 发表
黑哥指教的是,知错了。


“我是DBA”, 可能你误会了。

说心痛不是指你,而指这个贴子。

常来这里的朋友,我想, 多是做技术的吧?做技术的就得有个认真的态度,适当水贴是允许的,但绝对不能泛滥,否则长此以往,这个版也就失去了其存在的意义了。

希望大家爱护shell版块,毕竟许多人已经或者正在从中受益良多,对shell版有难舍之情。

[ 本帖最后由 blackold 于 2009-3-2 09:04 编辑 ]
作者: blackold    时间: 2009-03-01 22:18
标题: 回复 #38 ztj2247 的帖子
请参考awk语法: pattern {action}。

$1=$1相当于 $1=$1 {print $0}

[ 本帖最后由 blackold 于 2009-3-1 22:20 编辑 ]
作者: haimming    时间: 2009-03-01 22:36
标题: 回复 #39 blackold 的帖子
我本没有灌水之意,代码都是在自己的机子上试过了才敢贴上来(水平不够,不敢造次),但怎奈被自己的机子戏弄了一回(一开始确实可以的,这让我到现在都没能明白是怎么回事);

下午一个很简单的问题,也被我给灌了半天,最终问题也不知解决了没有,只有LZ的一句谢(结果如何,不知)


以后得学习谨慎的态度,水平也有待提高
作者: ywlscpl    时间: 2009-03-02 08:33
原帖由 haimming 于 2009-3-1 21:57 发表



[rockfall@tmp]$awk '$1=$1' kkkk
1 2 3 4
a a a 5 2 7
[rockfall@tmp]$cat kkkk
1 2          3  4
0 2          3  4
a a a  5 2             7
[rockfall@tmp]$


0开头的行不见 了


因为$1=0
awk '$1=$1' kkk ==> awk '$1{print}' kkk
可以用awk '{$1=$1}1' kkk

[ 本帖最后由 ywlscpl 于 2009-3-2 08:34 编辑 ]
作者: flynetcn    时间: 2009-03-02 09:20
文件多大?如果100G呢?
作者: justlooks    时间: 2009-03-02 09:22
sort -k1 dfile2|awk -F":" -v num=0 '{if($1!=num){num=$1;print "["num"]";}print $2}'
作者: 飞鸿无痕    时间: 2009-03-02 09:45
原帖由 blackold 于 2009-3-1 20:51 发表
没有统计具体个数:
awk -F : '{a[$1]=a[$1]"\n"$2}END{for ( i in a ) print "["i"]"a}' urife
输出为:


这个符合要求,学习下!
作者: liaosnet    时间: 2009-03-02 09:49
标题: 回复 #2 我是DBA 的帖子
牛啊,羊啊.....
这种写法很奇特..
作者: Dalamar    时间: 2009-03-02 09:51
cat t.txt | awk -F ":" '{print $2}' | sort | uniq -c | awk '{print "["  $2  "]" $1 }'  
不考虑效率,凑合用用
作者: liaosnet    时间: 2009-03-02 09:53
标题: 回复 #24 blackold 的帖子
额..这时候使用 awk 'NF=NF' 就不会有问题了...$1=$1显然会有副作用...
作者: 飞鸿无痕    时间: 2009-03-02 09:58
标题: 回复 #1 xinxin12375 的帖子
awk '{a[$1]=a[$1]"\n"$2;sum[$1]++}END{for (i in a)print "["i"]",a"\n"sum}' urfile  这个即统计了个数也统计了手机号!!!try
作者: justlooks    时间: 2009-03-02 10:03
原帖由 我是DBA 于 2009-3-1 22:04 发表
用$1=$1不行
那就换成$2=2
再不行换成$3=$3
换到行为止。


安全点就用 NF+=1
作者: cjaizss    时间: 2009-03-02 10:14
这个应该是shell的基础了。
所以在吹简历的时候虽然不能不吹,但要做到心中有数,自己能摆的平,呵呵
本人毕业不到一年,在Linux下也没什么经验,以前在学校基本上没接触过linux,不过以后想在linux下发展,于是就去应聘Linux下的搜索工程师,简历上写了熟悉shell编程(呵呵,其实只是勉强知道一些),结果面试官一上来就出了一个题,大致是这样的:有一个文件是QQ号到手机号的绑定关系,一行一个关系,格式如下:11235334:13443253456。然后统计出每个QQ绑定了几个手机,输出到一个文件里。格式如下
:[11235334]
13454543454
13643543544
[23432423]
13654645542

结果一下子就闷了,后来的问题也就没什么意义了,真是失败,看来现在要恶补了,哪位哥们帮忙解答一下上面的问题,随便给点意见,我选择Linux是不是一个错误???

  1. awk 'BEGIN{FS="[ \t]*:[ \t]*";}NF==2{a[$1]=sprintf("%s\n%s",a[$1],$2)}END{for (i in a) {printf(":[%d]%s\n",i,a[i]);} }' $f1 >$f2
复制代码

[ 本帖最后由 cjaizss 于 2009-3-2 11:21 编辑 ]
作者: justlooks    时间: 2009-03-02 10:24
原帖由 liaosnet 于 2009-3-2 09:53 发表
额..这时候使用 awk 'NF=NF' 就不会有问题了...$1=$1显然会有副作用...


NF=NF也不好,考虑有空行的环境,空行会被移去
作者: liaosnet    时间: 2009-03-02 11:20
原帖由 justlooks 于 2009-3-2 10:24 发表


NF=NF也不好,考虑有空行的环境,空行会被移去


NF+=1
作者: 大狗狗    时间: 2009-03-02 11:34
标题: 自己想的笨方法
perl -e 'while(<>){chomp;if (/\[(\d+)\]/){print "\n$1\t"}else{print "$_\t"}}'  1.txt  |awk 'NR>1{a[$1]=NF-1}END{for(i in a){print i,a}}'
作者: huifeideluotuo    时间: 2009-03-02 11:50
楼主运气真好,其实这个就是和腾讯的架构有点关系,手机登陆,用文件进行存储
作者: zyp339025518    时间: 2009-03-02 12:49
呵呵,这个问题很实际。
作者: xdsnet    时间: 2009-03-02 14:07
前面可能大家都先假设了给出的数据是已经排序过多,我想这个假设可能是不成立的吧。
其实我觉得楼主的题目叙述是不清楚的,有比较多的歧义。

[ 本帖最后由 xdsnet 于 2009-3-2 14:12 编辑 ]
作者: zhangjiakouzf    时间: 2009-03-02 14:11
原帖由 xinxin12375 于 2009-3-1 20:26 发表
本人毕业不到一年,在Linux下也没什么经验,以前在学校基本上没接触过linux,不过以后想在linux下发展,于是就去应聘Linux下的搜索工程师,简历上写了熟悉shell编程(呵呵,其实只是勉强知道一些),结果面试官一 ...


那天我也去了,你是在深圳还是在北京?

他明确的说了让你用shell命令来实现了吗?如果没有的话,我觉得他在问算法!!

我那天没碰到这个问题,如果问我,我会说用 trie tree 来进行关键字统计,并其在节点上加链表,统计完了以后再对树进行遍历。

还有面试官有没有说原数据有多少个,内存限制多少M啊?

我碰到的问题是,1000万个整数里面快速找出前50个最大的数,大家说说该怎么做?
作者: 我是DBA    时间: 2009-03-02 14:17
标题: 回复 #58 zhangjiakouzf 的帖子
这个用shell来做吗?
建个数据库,把数据导进表,再建个索引,一个语句就OK了。
作者: lbaby    时间: 2009-03-02 14:30
这玩意用shell 作没啥效率,用perl的hash表还可以
作者: pFreeStyle    时间: 2009-03-02 14:31
原帖由 xinxin12375 于 2009-3-1 20:26 发表
本人毕业不到一年,在Linux下也没什么经验,以前在学校基本上没接触过linux,不过以后想在linux下发展,于是就去应聘Linux下的搜索工程师,简历上写了熟悉shell编程(呵呵,其实只是勉强知道一些),结果面试官一 ...



可以借用awk中的数组
作者: lbaby    时间: 2009-03-02 14:31
原帖由 zhangjiakouzf 于 2009-3-2 14:11 发表


那天我也去了,你是在深圳还是在北京?

他明确的说了让你用shell命令来实现了吗?如果没有的话,我觉得他在问算法!!

我那天没碰到这个问题,如果问我,我会说用 trie tree 来进行关键字统计,并其在 ...



最大堆啊, 这个问题面试管最爱问了
作者: liaosnet    时间: 2009-03-02 14:51
标题: 回复 #1 xinxin12375 的帖子
没接触过linux就想着做linux工程师.....
作者: creating2008    时间: 2009-03-02 15:01
cat yy.txt|sort|uniq|awk -F: '{if (temp!=$1) {temp=$1;print "["$1"]\n"$2} else {print $2}}'

awk好像没有trim 功能
算法的话,最大堆,冒泡,选择都行
作者: simble1986    时间: 2009-03-02 15:37
原帖由 我是DBA 于 2009-3-1 20:40 发表
[test@erpdataserver ~]$ awk -v RS='[' '$1=$1{print "["$1,(NF-1)}' 1
[11235334] 2
[23432423] 1
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542

看来awk很重要!一定要好好学学!
作者: mixednuts    时间: 2009-03-02 15:52
awk '/^\[/{print i; print $1;i=0} /^[0-9]/{i=i+1} END{print i}' ufile
作者: FightingWu    时间: 2009-03-02 16:33
以前理论过一阵子shell基础,没用应用过,看这个题目得到大家的帮场,自己顺便学习了一阵子,终于捣鼓出来了:

1.txt 内容
36234 13951820394
39423231 15204442938
123 1300000
36234 15900009999
19 13390904349
39423231 15344232123

awk语句:
awk '{qq[$1]=qq[$1]"\n"$2 }END{for(qq_number in qq) print "["qq_number"]",qq[qq_number]}' 1.txt

结果:
[36234]
13951820394
15900009999
[19]
13390904349
[39423231]
15204442938
15344232123
[123]
1300000

感觉还是多练习会收获大点。我主要参考了http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2810128的教程,感觉很基本,很实用。

[ 本帖最后由 FightingWu 于 2009-3-2 16:35 编辑 ]
作者: fengshasha    时间: 2009-03-02 16:35
自己学了4年还是初级
作者: FightingWu    时间: 2009-03-02 16:42
cat yy.txt|sort|uniq|awk -F: '{if (temp!=$1) {temp=$1;print "["$1"]\n"$2} else {print $2}}'
---
很good
作者: tinyhong    时间: 2009-03-02 16:59
[root@cos5test ~]# head qq.txt
22129:2453
17600:12824
16604:3711
5564:17160
23510:27559
22414:519
7718:22043
3779:10
7253:29538
29035:29505
[root@cos5test ~]# cat qqsplite.sh
#!/bin/bash

phones=""
count=1
lastqqnum=""
cat - | sort -n |
while read line
do
        qqnum=`echo $line|cut -d":" -f1`
        phonenum=`echo $line|cut -d":" -f2`
        [ -z ${lastqqnum} ] && phones=${phonenum}
        if [ ${qqnum}1 = ${lastqqnum}1 ]
        then
                phones="${phones}{phonenum}"
                count=`expr $count + 1`
        elif [ ! -z ${lastqqnum} ]
        then
                echo '['${lastqqnum}']:'$count
                echo ${phones}|tr ':' '\012'
                phones=${phonenum}
                count=1
        fi
        lastqqnum=${qqnum}
done
[root@cos5test ~]# cat qq.txt|./qqsplite.sh |head -n20
[8]:2
25897
25897
[16]:2
1989
1989
[25]:2
24946
24946
[38]:4
18698
18698
25608
25608
[53]:2
21357
21357
[56]:2
26753
26753
作者: chenxkg    时间: 2009-03-02 17:36
这个,awk不怎么上手,perl行不 :)

  1. #!/usr/bin/perl -w

  2. my %hash;
  3. while(<DATA>){
  4.   chomp;
  5.   my($v1,$v2) = split /:/;
  6.   push @{$hash{$v1}},$v2;
  7. }
  8. foreach $v1(sort keys %hash){
  9. my @num = @{$hash{$v1}};

  10. print "\[$v1\]\n";
  11. print join "\n",sort @num;
  12. print "\n";
  13. }

  14. __END__
  15. AAA:111111111
  16. BBB:222222222
  17. CCC:333333334
  18. AAA:123456784
  19. CCC:875312341
复制代码


  1. ./hash.pl
  2. [AAA]
  3. 111111111
  4. 123456784
  5. [BBB]
  6. 222222222
  7. [CCC]
  8. 333333334
  9. 875312341
复制代码

[ 本帖最后由 chenxkg 于 2009-3-2 17:40 编辑 ]
作者: 深蓝for纯小白    时间: 2009-03-02 18:46
呵呵 需要的编程 + shll !

腾讯老技巧了。。。
作者: wxws2002    时间: 2009-03-02 20:46
新手版,未经测试。哈哈

awk -F: {Print "["$1"]"}> qq.txt
cat qq.txt | sort -u >tmp.txt
for i in $(cat tmp.txt)
do
echo $i > last.txt
grep $i qq.txt | awk -F: {Print $2} >>last.txt
done
作者: xinxin12375    时间: 2009-03-02 21:18
原帖由 我是DBA 于 2009-3-1 20:40 发表
[test@erpdataserver ~]$ awk -v RS='[' '$1=$1{print "["$1,(NF-1)}' 1
[11235334] 2
[23432423] 1
[test@erpdataserver ~]$ cat 1
[11235334]
13454543454
13643543544
[23432423]
13654645542



首先多谢各位用心解答,不过希望能结合题目给点解析,另外再推荐一些Shell的典型题目和解答。
作者: blackold    时间: 2009-03-02 21:30
标题: 回复 #74 xinxin12375 的帖子
请问LZ真正的问题是什么?
作者: xinxin12375    时间: 2009-03-02 23:23
原帖由 zhangjiakouzf 于 2009-3-2 14:11 发表


那天我也去了,你是在深圳还是在北京?

他明确的说了让你用shell命令来实现了吗?如果没有的话,我觉得他在问算法!!

我那天没碰到这个问题,如果问我,我会说用 trie tree 来进行关键字统计,并其在 ...


我在深圳,唉,如果问你那种问题就好了,我擅长的就是算法和网络编程,你那个问题是个老题目了,用最小堆就可以了,先读50个数到内存,调整成最小堆,然后依次读剩下的数,和堆顶元素比较,比堆顶大的话就将堆顶换掉,然后再调整成最小堆,直到所有的数比较完。
作者: zhangjiakouzf    时间: 2009-03-03 13:04
原帖由 xinxin12375 于 2009-3-2 23:23 发表


我在深圳,唉,如果问你那种问题就好了,我擅长的就是算法和网络编程,你那个问题是个老题目了,用最小堆就可以了,先读50个数到内存,调整成最小堆,然后依次读剩下的数,和堆顶元素比较,比堆顶大的话就将 ...


呵呵,这个应该也可以,但效率问题很难接受吧

面试官的答案说的是:“位图”排序
作者: likuku    时间: 2009-03-03 13:23
牛吹大了,自然会爆。
作者: chief-kid    时间: 2009-03-03 14:44
标题: 三个数组实现的
题外话:如果源文件中有第二个字段是空的记录的话,替换成特殊字符串也可以正常工作。

shift@xxxx:~$ cat 1.txt
123:1238123123
123:3123129403
234:2349812394
123:1293182098
345:1923918203
234:1923018230
123:1923018293
shift@xxxx:~$ awk -F: '{a[$1,$2]=$2;b[$1]=$1;c[$2]=$2} END {for(i in b){print "["i"]";for (j in c) if (a[i,j] != "")print a[i,j]}}' 1.txt
[123]
3123129403
1293182098
1238123123
1923018293
[234]
2349812394
1923018230
[345]
1923918203
shift@xxxx:~$
作者: lbaby    时间: 2009-03-03 16:50
原帖由 zhangjiakouzf 于 2009-3-3 13:04 发表


呵呵,这个应该也可以,但效率问题很难接受吧

面试官的答案说的是:“位图”排序


面试管的答案靠谱么?
就你描述的来说,肯定不行
作者: zhangsanji    时间: 2009-03-03 18:37
cat qq.tel |sort|awk -F : '{if(tmp != $1) {tmp = $1; print "[" tmp "]";} print $2;}'
作者: huyongzs    时间: 2009-03-03 19:04
楼主来逗人玩?
作者: xueyumusic    时间: 2009-03-04 00:46
标题: 回复 #1 xinxin12375 的帖子
我觉得可以这样:
awk  -F : '
{
     freq[$1]++;
     content[$1]+=$2;
}
END{
   for(qqnum in content)
    {
         printf   "[%d]\n" ,  qqnum;
         for(mobilenum in content[qqnum])
             printf   "%d\n" , mobilenum
     }
}'  1
作者: iverson_wuwei    时间: 2009-03-04 09:39
没有 你的选择很对,但是只是还是需要时间的积累一些知识,linux可以很好的被优化,被适用于上网本中,netbook作为以后的主力移动产品来说,linux是一个很好的载体,也就需要很好的软件支持。有前途
作者: aiyinsiann    时间: 2009-03-04 09:46
没接触 真看不懂
作者: chinesedragon    时间: 2009-03-04 14:56
QQ公司太恶心人了吧
作者: xp55699312    时间: 2009-03-05 09:33
都是牛人啊....我还得加强学习..
作者: zhugcx    时间: 2009-03-05 12:38
grep “11235334:”|wc -l
作者: c-aries    时间: 2009-03-05 13:10
……
这么基础,看多一些SHELL脚本,学多一些源代码就知道了
作者: riplab    时间: 2009-03-05 15:12
很简单俺都看不懂哦
作者: cczy    时间: 2009-03-05 22:07
awk -F : '{a[$1]=a[$1]"\n"$2}END{for ( i in a ) print "["i"]"a}' urife

请教下,这里的  {a[$1]=a[$1]"\n"$2} 这个能解释一下吗,我研究了半天也没看太懂
谢谢!
作者: yancier    时间: 2009-03-06 11:00
越看越复杂.....
作者: 我是DBA    时间: 2009-03-06 11:06
标题: 回复 #91 cczy 的帖子
这个就是一个累加啊
下标相同的情况,值后面一直接过去
作者: cczy    时间: 2009-03-06 13:15
累加???你的意思是说:a[$1]=a[$1]"\n"a[$2]


awk每次读取 一个行记录,它把每个记录的第一个字段用a[$1]这个数组来表示,$1就是数组a的索引,a[$1]=a[$1]"\n"a[$2]的意思就是说
把等号后边的内容加赋值给a[$1],相当于a[$1]+="\n"a[$2]
作者: xinxin12375    时间: 2009-03-06 13:48
awk -F : '{a[$1]=a[$1]"\n"$2}END{for ( i in a ) print "["i"]"a}' urife

这位朋友的代码很经典啊,类似STL中的map,我为什么没想到数组呢,呵呵。
作者: 我是DBA    时间: 2009-03-06 13:49
标题: 回复 #94 cczy 的帖子
不是做增加计算,是做字符串相加
作者: cczy    时间: 2009-03-06 13:52
原帖由 justlooks 于 2009-3-2 09:22 发表
sort -k1 dfile2|awk -F":" -v num=0 '{if($1!=num){num=$1;print "["num"]";}print $2}'



改进版:

$sort -k1 ufile2 | awk -F":" '{BEGIN{num=0;cnt=1}{if ($1!=num){num=$1;cnt=1;print "["num"]"}else cnt++} print $2,cnt}'
作者: cooljean2008    时间: 2009-03-06 13:56
'BEGIN{
作者: cczy    时间: 2009-03-06 14:12
原帖由 cooljean2008 于 2009-3-6 13:56 发表
'BEGIN{



对对对,begin前没有{
sort -k1 ufile2| awk -F":" 'BEGIN{num=0;cnt=1}{{if ($1!=num){num=$1;cnt=1;print "["num"]"}else cnt++} print $2,cnt}'
作者: ljt2k    时间: 2009-03-06 14:16
原帖由 blackold 于 2009-3-1 20:51 发表
没有统计具体个数:
awk -F : '{a[$1]=a[$1]"\n"$2}END{for ( i in a ) print "["i"]"a}' urife
输出为:



这个算法已经足够简洁实用了啊!
验证通过:
>cat a.log
123:aaa
123:bbb
456:ddd
456:eee
123:ccc
>awk -F":" '{a[$1]=a[$1]"\n"$2}END{for ( i in a ) print "["i"]"a}' a.log
[456]
ddd
eee
[123]
aaa
bbb
ccc




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