面试系列之《Linux&Shell》(更新中)

2023-09-21 02:08:08

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/bash

start_date=$1
end_date=$2

echo $start_date
while [ $start_date != $end_date ]
do
  start_date=$(date -d "$start_date +1 day" +"%Y-%m-%d")
  echo $start_date
done 

3.

更多推荐

Android Kotlin 基础详解

1,基础语法1.1可变变量与不可变变量可以多次赋值的变量是可变变量,用关键字var表示:var<标识符>:<类型>=<初始化值>注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。varname:String="yuanzhen"name="yuanzhen1"varage:Int=20a

27、Flink 的SQL之SELECT (窗口函数)介绍及详细示例(3)

Flink系列文章1、Flink部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接13、Flink的tableapi与sql的基本概念、通用api介绍及入门示例14、Flink的tableapi与sql之数据类型:内置数据类型以及它们的属性15、Flink

Spring Boot中Tomcat服务器参数解析及高并发控制

SpringBoot中Tomcat服务器参数解析及高并发控制SpringBoot集成了多种服务器,默认使用了Tomcat服务器。在高并发情况下,合理地配置Tomcat服务器参数对于控制请求量和提高系统的稳定性至关重要。本文将解释SpringBoot中涉及Tomcat服务器的一些关键参数,并探讨在高并发情况下如何通过这些

JS中Symbol的介绍

1、引入Symbol类型的背景ES5的对象属性名都是字符串,这容易造成属性名冲突的问题举例:使用别人的模块/对象,又想为之添加新的属性,这就容易使得新属性名与原有属性名冲突2、Symbol类型简介symbol是一种原始数据类型其余原始类型:未定义(undefined)、空值(null)、布尔值(boolean)、字符串

进一步观察扩散模型中的参数有效调整

摘要:像Stablediffusion[31]这样的大规模扩散模型非常强大,可以找到各种真实世界的应用程序,而通过微调来定制这样的模型会降低内存和时间的效率。受自然语言处理最新进展的推动,我们通过插入小型可学习模块adapters(称为适配器)来研究大型扩散模型中的参数高效调优。具体来说,我们将适配器的设计空间分解为正

[Linux入门]---文本编辑器vim使用

文章目录1.Linux编辑器-vim使用2.vim的基本概念4.vim正常模式命令集从正常模式进入插入模式从插入模式转换为命令模式移动光标删除文字复制替换撤销更改跳至指定行5.vim末行模式命令集5.总结1.Linux编辑器-vim使用vi/vim作为Linux开发工具之一,从它的键盘操作图也可以知道,它的操作不会很简

网络安全(黑客)自学

前言:我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,

Feign实战-Springboot集成OpenFeign Demo以及参数详解

最近整理一下微服务的文章,先拿一直用的OpenFeign开刀思考:微服务之间如何方便优雅的实现服务间的远程调用一、说说openFeign是什么吧?说到这个,那不得不先说说RPC1.什么是RPCRPC全称是RemoteProcedureCall,即远程过程调用,其对应的是我们的本地调用。RPC的目的是:让我们调用远程方法

【前端设计模式】之策略模式

概述在前端开发中,我们经常会遇到需要根据不同的条件或情况来执行不同的算法或行为的情况。这时,策略模式就能派上用场。策略模式是一种行为型设计模式,它将不同的算法封装成独立的策略对象,使得这些算法可以互相替换,而不影响客户端代码。这种灵活性和可扩展性使得策略模式在前端开发中得到广泛应用。前端应用示例1.抽象策略类假设我们正

集简云票税通,高效、管理销项发票,满足多样化开票需求

随着数字化时代的到来,传统的纸质发票已经逐渐被电子发票所替代。然而,对于许多企业来说,管理和开具大量的销项发票仍然是一项繁琐的任务:票税处理成本高,手工开票效率低。部分企业手工开票量大,耗费大量财务精力。企业对账难,涉税数据分散,财务工作量大业务财务系统之间无法连接,数据传递和回传的及时性和准确性难以把控......为

【汇编】数制与数据编码

【汇编】数制与数据编码文章目录【汇编】数制与数据编码1、计算机中的数制1.1数制介绍1.1.1进制1.1.2进制转换1.2基本数学运算1.2.1原反补码1.2.2加法&减法溢出&进位补码运算1.3其他数据编码1、计算机中的数制1.1数制介绍1.1.1进制不同进制是用于表示数字的不同数制系统,它们在数学、计算机科学和工程

热文推荐