博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道面试题考验Linux命令
阅读量:6906 次
发布时间:2019-06-27

本文共 1097 字,大约阅读时间需要 3 分钟。

hot3.png

某个目录下有两个文件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数

答案,大家可以参考下:(对应把ip1,ip2分别换为a,b即可)

1):cat ip1.txt |awk -F"[\t]" '{w[$1]+=1}END{for (a in w) print a,w[a]}'|wc -l

2):diff ip1.txt  ip2.txt |grep '>' |sed 's/> //g'|awk '{w[$1]+=1}END{for(a in w)print a}'

3):

cat ip1.txt ip2.txt|awk '{u[$1" "$2]+=1}END{for(i in u) print i,u[i]}'|awk 'BEGIN{print "user" "\t" "user_count" "\t" "ip_count"}{u[$2]+=$3;ip[$2]+=1}END{for(i in u)print i"\t"u[i]"\t"ip[i]}'


上面内容从网上得来。但是我个人觉得这个答案不是完全正确的,它的问题在于没有对原文件进行排序,这样在做diff操作时得到的结果不准确。

而如果加上排序的话,那么可能不能使用一条命令完成整个功能,因为我没有找到一个办法将两个排序后的内容整合在一块,换句话说,可以使用管道来重定向一个命令的结果,但是两个的怎么办?

这里要考虑sort命令可以用来排序,并且可以针对列排序。


这里需要注意的用法有:

awk中:

1 变量可以直接使用,比如这里面的w是直接用的。

2 数组的index可以为任意值,比如w[$1]。

3 循环和数组结合使用的方法:

for (a in w) print a,w[a]

4 awk中的BEGIN{}和END{}是在最初后最后只分别执行一次,而不是每行都执行。

另外,注意这里sed来处理行,跟grep相比,sed有很强功能,比如替换,这是grep无法做到的。

转载于:https://my.oschina.net/shawnplaying/blog/617695

你可能感兴趣的文章
【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集
查看>>
最新的goldengate monitor 12.1.3已经发布
查看>>
ASP.NET防止用户多次登录的方法
查看>>
2D多边形碰撞器优化器
查看>>
webBrowser 模拟登录
查看>>
idea 配置多个tomcat
查看>>
weblogic 整合cxf 报错:cannot create a secure XmlInputFactory
查看>>
Nancy 返回值详解
查看>>
架构思维案例:速学正则
查看>>
记录一则FGA审计“A用户对B用户某张表的更新操作”需求
查看>>
IntelliJ IDEA优秀插件(编程通用)
查看>>
API返回错误信息的最佳实践
查看>>
AngularJS实现三级Table列表
查看>>
scala sortBy and sortWith
查看>>
请求合并哪家强
查看>>
nodejs检查已安装模块
查看>>
solr联合多个字段进行检索(multivalued和copyfield的使用)
查看>>
准备PPT过程中的一些文档记录
查看>>
Catel(翻译)-为什么选择Catel
查看>>
SQL Server 数据库备份和还原
查看>>