面试系列之《LinuxShell》(更新中)

1.用awk命令实现一个词频统计。

假设文件名“data”,文件内容:

A B C D
A C D
D B C C

1.1. python实现

因为不熟悉awk命令,当时用python实现的:

res_dict = {}
with open('./data', 'r', encoding='utf-8') as fp:for line in fp:for item in line.strip('\n').split(' '):res_dict[item] = res_dict.get(item, 0) + 1
print(res_dict)# {'A': 2, 'B': 2, 'C': 4, 'D': 3}

追问:怎么对这个字典按照出现次数大小降序排序?
正确答案:

sorted(res_dict.items(), key=lambda item: item[1], reverse=True)    # 方式1
sorted(res_dict.items(), key=lambda item: -item[1])     # 方式2

我当时给的答案:

sorted(res_dict, key=lambda k, v: v, reverse=True)

上面代码有两处错误:
1.参数1直接从字典res_dict中获取的只是key,而不是想当然的(key, value)。如果需要获取所有类型为(key, value)的元素,需要调用res_dict.items()。
2.这里的关键字参数key的lambda表达式里参数只能有一个(注意本身python里lambda表达式参数的个数并不限制,可以为任意个,此处应该是sorted方法本身对该参数的限制。),也就是传入的参数为可迭代对象中的单个元素,返回值是根据这个元素所定义的比较规则,默认升序。

关于sorted方法具体可以参考文档:https://docs.python.org/zh-cn/3/howto/sorting.html#key-functions,该方法的返回值为包含所有可迭代对象元素的列表,所以上面如果需要按字典格式输出,可以通过dict()强转一下。

1.2. awk命令实现

# 写法1 从标准输出流读取
cat data | awk 'BEGIN{FS=" "} {for(i=1;i<=NF;i++) freq[$i]++} END{for(word in freq) print word "\t" freq[word]}' | sort -rnk 2# 写法2 从文件读取
awk 'BEGIN{FS=" "} {for(i=1;i<=NF;i++) freq[$i]++} END{for(word in freq) print word "\t" freq[word]}' data | sort -rnk 2

对于上面命令的解释:

  • BEGIN:后面的动作在文件第一行被读取之前执行,类似于初始化的意思。这里{FS=" "}的含义是设置行分割符为空格。
  • END:最后一行数据处理完之后执行,这里用来循环获取freq里的键值。
  • 中间for循环就是真正对数据处理的方法体,循环中的NF,是awk内置的一个变量,代表正在处理的当前行的总列数。

1)关于awk命令,整个执行流程可以理解为从输出流或文本里从第一行逐行往下读取数据,每行数据按照FS参数指定的分隔符(不指定默认空格)划分为N列,列值保存给变量$1、$2、$3…,然后针对行或划分后的列值根据我们定义的规则选择是否执行某些操作。
该命令的通常使用格式:awk '条件类型1{动作1} 条件类型2{动作2} ...' filename,动作中可以是简单的单语句操作,也可以是复杂的多语句操作,像for循环、while循环等,总之,可以像python和java等高级语言那样自由的编写代码,更多使用方式可以参考官网:
https://www.gnu.org/software/gawk/manual/gawk.html#For-Statement

2)关于sort命令,参数代表的含义:
-r:reverse,逆序输出
-n:numeric-sort,根据字符串对应的数值大小来排序,而非字符串的字典顺序。这里是统计频次。
-k:key,指定用来排序的key,上面用2来指定根据频次排序,2代表的是第2列。

PS:
后来自己实现awk词频统计的过程中遇到了点儿小问题,一直找不到原因,有朋友知道欢迎指出。
当直接在虚拟机中通过vim新建data文件时,统计正常输出结果:

C 4
D 3
B 2
A 2

当在本地(win10)建好数据文件上传到虚拟机中时,统计输出:

C 4
D 2
B 2
A 2
D 1

也就是D本来是3,在后面被拆分成了2+1,开始猜想是换行符的问题,在linux中用了dos2unix转换下,结果还是这样,有懂的朋友欢迎留言。

2.给定两个日期,获取中间的所有日期序列。

例如“2023-01-01”和“2023-01-10”,获取两日期之间的所有日期。

#!/bin/bashstart_date=$1
end_date=$2echo $start_date
while [ $start_date != $end_date ]
dostart_date=$(date -d "$start_date +1 day" +"%Y-%m-%d")echo $start_date
done 

3.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win系统环境搭建(九)——Windows安装chatGPT

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;九&#xff09;——Windows安装chatGPT 本系列windows环境搭建开始讲解如何给win系统搭建环境&#xff0c;本人所用系统是腾讯云服务器的Windows Server 2022&#xff0c;你可以理解成就是你用的windows…

使用 nohup 运行 Python 脚本

简介&#xff1a;在数据科学、Web 开发或者其他需要长时间运行的任务中&#xff0c;我们经常需要让 Python 脚本在后台运行。尤其是在远程服务器上&#xff0c;可能因为网络不稳定或需要执行多个任务&#xff0c;我们不希望 Python 脚本因为终端关闭而被终止。这时&#xff0c;…

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一著辉少许

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一著辉少许

达梦数据库随系统开机自动启动脚本

写一个脚本&#xff0c;实现在服务器开机后自动启动达梦数据库的功能。 1. 在/etc/init.d/目录下&#xff0c;编写脚本&#xff0c;并将脚本命名为startdm.sh。脚本内容实现如下&#xff1a; #!/bin/bash #chkconfig:2345 80 90 #decription:启动达梦# 切换到 dmdba 用户 su …

Unity云原生分布式运行时

// 元宇宙时代的来临对实时3D引擎提出了诸多要求&#xff0c;Unity作为游戏行业应用最广泛的3D实时内容创作引擎&#xff0c;为应对这些新挑战&#xff0c;提出了Unity云原生分布式运行时的解决方案。LiveVideoStack 2023上海站邀请到Unity中国的解决方案工程师舒润萱&#x…

倒计时列表实现(小程序端Vue)

//rich-text主要用来将展示html格式的&#xff0c;可以直接使用这个标签 <view class"ptBox" v-for"(item,index) in orderList" :key"index"> <rich-text :nodes"item.limit_time|limitTimeFilter"></rich-text>…

2023_Spark_实验十二:Spark高级算子使用

掌握Spark高级算子在代码中的使用 相同点分析 三个函数的共同点&#xff0c;都是Transformation算子。惰性的算子。 不同点分析 map函数是一条数据一条数据的处理&#xff0c;也就是&#xff0c;map的输入参数中要包含一条数据以及其他你需要传的参数。 mapPartitions函数是一个…

网络编程day03(UDP中的connect函数、tftp)

今日任务&#xff1a;tftp的文件上传下载&#xff08;服务端已经准备好&#xff09; 服务端&#xff08;已上传&#xff09; 客户端&#xff1a; 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h…

编译工具:CMake(八) | cmake 常用指令

编译工具&#xff1a;CMake&#xff08;八&#xff09; | cmake 常用指令 基本指令 基本指令 ADD_DEFINITIONS向 C/C编译器添加-D 定义&#xff0c;比如:ADD_DEFINITIONS(-DENABLE_DEBUG-DABC)&#xff0c;参数之间用空格分割。 如果你的代码中定义了#ifdef ENABLE_DEBUG #end…

Java 调用 GitLabAPI 获取仓库里的文件件 提交记录

1. 需求 项目组 需要做统计&#xff0c;获取每个开发人员的代码提交次数&#xff0c;提交时间&#xff0c;提交人等等&#xff0c;因代码在GitLab上管理&#xff0c;所以需要调用GitLabAPI来获取。 2. 开发 API官网&#xff1a;https://docs.gitlab.com/ee/api/ 2.1 创建自…

java Spring Boot验证码美化,白色背景 随机四个数 每个字随机颜色

我前文 Spring Boot2.7生成用于登录的图片验证码讲述了生成验证码的方法 但是这样生成验证码 非常难看 比较说 验证码是要展示到web程序中的 这样让用户看着 属实不太好 我们可以将接口改成 GetMapping(value "/captcha", produces MediaType.IMAGE_PNG_VALUE) …

Spring Task(简略笔记)

介绍 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 Corn表达式 corn表达式其实就是一个字符串&#xff0c;通过corn表达式可以定有任务触发的时间 构成规则&#xff1a;分为6或7个域&#xff0c;由空格分隔开&#xff0…

RocketMQ 发送事务消息

文章目录 事务的相关理论事务ACID特性CAP 理论BASE 理论 事务消息应用场景MQ 事务消息处理处理逻辑 RocketMQ 事务消息处理流程官网事务消息流程图 rocketmq-client-java 示例&#xff08;gRPC 协议&#xff09;创建事务主题生产者消费者 rocketmq-client 示例&#xff08;Remo…

代码随想录Day1 数组基础

本文详细说明和思路来源于: 代码随想录 视频讲解: 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili Leetcode T 704 题目链接 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 题目概述1: 思路: 1.因…

基于微信小程序的高校宿舍信息管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

局域网下共享文件夹全流程

请注意&#xff1a;配置共享文件夹以便他人无需输入账户和密码访问可能带来安全风险。请确保你明白这一点并在适当的网络环境中操作。 以下说明是基于 Windows 系统的&#xff1a; 步骤 1&#xff1a;共享文件夹 找到你想要共享的文件夹&#xff0c;右击选择“属性”。 转到…

play() failed because the user didn‘t interact with the document优化媒体不能自动播放

1. 问题 谷歌浏览器 video 元素设置 autoplay&#xff0c;我们原意是希望页面加载时自动播放&#xff0c;但实际上并没有自动播放&#xff0c;在控制台报错如下&#xff1a; Uncaught (in promise) DOMException: play() failed because the user didn’t interact with the d…

Docker从认识到实践再到底层原理(六-1)|Docker容器基本介绍+命令详解

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

RabbitMQ学习总结(11)—— RabbitMQ 核心概念与架构

MQ 技术概述 什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服务。使用…

怎样判断一个数是否为偶数

要求代码行数尽可能少; package mainimport ( "fmt" "strconv")func main(){ fmt.Printf("传入的值是否为奇数:%t\n",Judge_is_even(7))}func Judge_is_even(num int) bool { //fmt.Println(num % 2) rs, _ : strconv.ParseBool(strconv.Itoa(nu…