Hadoop工程师面试题:使用linux命令完成文本处理

某个目录下有两个文件a.txt和b.txt,文件格式为(ip,username),
列如:
a.txt

127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.0.0.2 lisi
127.0.0.3 wangwu
b.txt

127.0.0.4 lixiaolu
127.0.0.1 lisi
每个文件至少100万行,请使用Linux命令完成如下工作:
1)每个文件各自的ip数
2)出现在b.txt而没有出现在a.txt的ip
3)每个user出现的次数以及每个user对应的ip数

答:1)
cat a.txt | awk -F" " ‘{print $1}’ | sort -u > ipa.txt
wc -l ipa.txt

cat b.txt | awk -F" " ‘{print $1}’ | sort -u > ipb.txt
wc -l ipb.txt
2)diff ipa.txt ipb.txt | grep > | awk -F" " ‘{print $2}’

3)cat a.txt b.txt | awk -F" " ‘{u[$1" "$2]+=1} END{for(i in u) print i,u[i]}’
| awk -F" " ‘{u[$2]+=$3;ip[$2]+=1} END{for(i in u) print i,u[i],ip[i]}’

用到linux命令介绍:
1\awk
awk -F” ” ‘BEGIN{} {} END{}’
如: cat a.txt | awk -F” ” ‘{u[$1]+=1} END{for(i in u) print i,u[i]}’
注: 1)-F” ” : F表示分隔符,其后紧跟分隔符,用双引号括起来,不指定分隔符默认使用空格分隔
2)单引号中的语句-‘BEGIN{} {} END{}’可分成三部分:
BEGIN表示{}之前执行的语句,且只执行一次;
{}中的语句对于文件中的每一行执行一次;
END表示所有{}执行结束之后才执行一次的语句.

2\grep
grep str file : 从file中查找所有含有str串的行,并返回该行内容
grep -r update /etc/acpi : 查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串”update”的文件,并打印出该字符串所在行的内容
3\竖线’|’表示管道,前面命令的输出作为后面语句的输入

4\sort
sort file : 对file内容按递增排序(不去重),但并不修改源文件
sort -r file : 对file内容按递减排序(不去重),不改源文件
sort -u file > newfile: 对file内容进行排序(去重),但并不修改源文件,而是输入newfile中

5\‘>’
‘>’file : 表示输出至file内
若要表示字符大于号’>’,使用>转义.

6\wc
wc -l(–lines) file : 统计文件有多少行
wc -c(–chars,–bytes) file : 统计文件含有多少个字节

7\diff
diff filea fileb
注:1)若filea\fileb都有序,则该命令可以错位对齐; 2)若有一个无序,则严格按行比对;
设ipa.txt中内容为:有序
127.0.0.1
127.0.0.2
127.0.0.3
设ipb.txt中内容为:有序
127.0.0.1
127.0.0.3
127.0.0.4
diff ipa.txt ipb.txt -y -W 50 (错位对齐)
127.0.0.1 127.0.0.1
127.0.0.2 <
127.0.0.3 127.0.0.3

127.0.0.4
再使用grep > 即可取出ipb中有而ipa中没有的ip
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id 。

用mysql实现:不用hive的窗口函数
±—±------±-------±-------------+
| Id | Name | Salary | DepartmentId |
±—±------±-------±-------------+
| 1 | Joe | 70000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
| 5 | Janet | 69000 | 1 |
| 6 | Randy | 85000 | 1 |
±—±------±-------±-------------+
Department 表包含公司所有部门的信息。

±—±---------+
| Id | Name |
±—±---------+
| 1 | IT |
| 2 | Sales |
±—±---------+
编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:

±-----------±---------±-------+
| Department | Employee | Salary |
±-----------±---------±-------+
| IT | Max | 90000 |
| IT | Randy | 85000 |
| IT | Joe | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
±-----------±---------±-------+
SELECT
d.Name AS Department,
e.Name AS Employee,
e.Salary AS Salary
FROM Employee e,
Department d
where d.Id = e.DepartmentId

and (
SELECT COUNT(DISTINCT Salary)
FROM Employee AS ee
WHERE ee.DepartmentId = e.DepartmentId
AND ee.Salary >= e.Salary
) <= 3
ORDER BY DepartmentId ASC,Salary DESC
;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值