秒杀一众文本工具!

简介: 当涉及文件解析或者数据预处理时,你首先想到的编程语言是什么?Python、R、Java等编程语言会出现在脑海里。当然,这些高级编程语言功能强大,通常我们只需要几十行代码就可以实现我们的目标。

当涉及文件解析或者数据预处理时,你首先想到的编程语言是什么?

Python、R、Java等编程语言会出现在脑海里。

当然,这些高级编程语言功能强大,通常我们只需要几十行代码就可以实现我们的目标。

但是,Linux Shell这么强大的工具似乎被很多开发者遗忘了。

因为它的语法相对落后,而且线上教程不那么直观,社区也不是特别完善。所以,很多有开发者会首先想到利用Linux Shell进行数据处理。

在本文中,我将带你了解Shell命令在某些情况下到底有多么强大,更重要的是,你可以轻松学习,并且能够在日常的小需求中使用它。

本文主要围绕awk进行讲解,或许很多同学用过或者了解过awk。因此,在这里就简单的概括一下。

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

分隔符

分隔符是在数据处理过程中经常会接触到的一类问题,csv、日志文件,会都会涉及各种各样的分隔符。

在处理数据过程中就需要对这些分隔符进行分割、替换,以便于数据的处理和分析。

举个例子,假如我有一份csv数据,是以逗号作为分隔符,

index,col1,col2,col3
1,5,6,7
2,a,b,c
3,uu,vv,ww

现在我需要把逗号修改为tab,可以用下方命令:

awk '{$1=$1}1' FS="," OFS="\t" file4.csv > file4.txt

下面看一下输出结果,

index col1  col2  col3
1 5 6 7
2 a b c
3 uu  vv  ww

如果使用编程语言,此时你需要打开IDE,新建项目,编写代码。如果使用Linux Shell,只需要打开终端命令行即可。

现在让我们深入研究语法本身,解释一下上述命令的作用:

  • {$1=$1}1:重置缓冲区
  • FS=",":原始分隔符
  • OFS="\t":新的分隔符

然后,你只需要指定输入文件和输出文件即可!

相对于编程语言,Shell命令最酷的地方是,它通常预装在您的PC上,你无需担心设置环境,安装软件包(例如python pandas软件包)的麻烦。

转置

为了说明问题,假设你有以下文件:

item1 item2 item3 item4

为了使它们垂直显示,你只需要一行代码:

awk '{for(i=1;i<=NF;i++){print $i}}' file5.txt > file5_new.txt

输出结果:

item1 
item2 
item3 
item4

这个awk命令的作用是,对于每一行(在此输入文件中,我们只有一行),在列上进行遍历,从索引i = 1(第一列)开始,以索引i = NFNF结束 是awk中的特殊变量,代表每行的长度。

因此,上面的命令简单地说,对于列中的每个item,我们将其一一打印出来,每个item将占据整行,这使我们能够在这里实现自己的目标。

然后您可能会问,如果我有一个垂直输出,但我希望水平显示,您能撤消操作吗?当然!

cat file5_new.txt | tr '\n' ' ' | awk '{$1=$1}1' FS=" " OFS="\t" > file5_restore.txt

来看一下结果:

item1 item2 item3 item4

对这个命令的一些解释,我们首先使用cat读取文件,然后使用tr命令将每一行的换行符替换为空格,这就可以实现我们的目标。

awk基本用法

通过前面的示例,已经清楚了awk的强大之处,下面通过一个非常经典的任务,来指导你了解awk命令的基本语法。

假设你有一个如下文件:

index col2  col3  col4
i1  John  56  male
i2  Mary  34  female
i3  Frank 23  male
i4  Chris 58  female

我想知道col3的总和,可以在一行代码中实现吗?

这很有用,因为在现实生活中,输入文件可能有100万行,而不是示例中简单的4行。

awk 'BEGIN{FS="\t";count=0}{if(NR>1){count+=$3}}END{print count}' file6.txt
#输出 171

下面,介绍一下awk常用的标识符,这样就能够很清楚的了解上述命令的原理:

  • BEGIN:在开始处理每一行之前执行
  • MAIN:在处理每一行过程中执行
  • END:在结束每一行的处理之后执行
  • FS:输入文件的分隔符
  • OFS:输出文件的分隔符
  • NR:行号
  • NF:每一行的长度

awk逐行处理文件,但是它将在处理每一行之前可以在BEGIN中执行某些操作,并在完成处理每一行后执行一些操作。此属性使我们能够轻松地计算均值或总和。

因此,针对上述问题,当我们初始化一个计数变量并将其值累加到最后时,我们可以打印出最终的计数或将其取平均值以获得均值。

这样一来,我们将发现仅使用awk就可以在Linux Shell中完成许多任务。

为什么使用Linux Shell

目前,Python可以以更结构化的格式解决大多数任务的事实,为什么我们需要学习Shell命令?

答案是,Shell具有如下独特的优势:

  • 在Python中,我们需要处理变量,在内存中处理了数十个变量,然后,获得了所需的输出。但是在Shell中,我们处理的对象是文件,这使得,你只需要几行代码就可以完成成千上万文件的处理。
  • Shell命令允许你执行跨语言任务,或将多个Python,R甚至Matlab脚本粘合在一起作为元脚本。
  • 在某些情况下,Shell命令比其他脚本语言更方便。
  • Linux系统普遍存在于云计算平台,不需要经过任何额外配置

结语

开发过程中,首先应该清晰的认识到我们的目标是完成任务,而不是“炫技”。

解决一个问题可以寻找出很多不同的方法,但是如果在忙碌的工作中选取出最有效的方法,提升效率,这需要作为开发者的我们认真考虑的。

处理文件和数据过程中,使用Shell一行代码就可以实现其他语言几十行才能完成的任务,何乐而不为呢?

相关文章
|
自然语言处理 算法 搜索推荐
解锁搜索新境界!让文本语义匹配助你轻松找到你需要的一切!(快速上手baseline)
解锁搜索新境界!让文本语义匹配助你轻松找到你需要的一切!(快速上手baseline)
解锁搜索新境界!让文本语义匹配助你轻松找到你需要的一切!(快速上手baseline)
正则表达式和表单辅助特效&&淘宝购物车
正则表达式和表单辅助特效&&淘宝购物车
|
1月前
|
人工智能 自然语言处理
Promptriever:信息检索模型,支持自然语言提示响应用户搜索需求
Promptriever 是一种新型信息检索模型,由约翰斯·霍普金斯大学和 Samaya AI 联合推出。该模型能够接受自然语言提示,并以直观的方式响应用户的搜索需求。通过在 MS MARCO 数据集上的训练,Promptriever 在标准检索任务上表现出色,能够更有效地遵循详细指令,提高查询的鲁棒性和检索性能。
62 6
Promptriever:信息检索模型,支持自然语言提示响应用户搜索需求
|
3月前
Midjourney-04 收集Prompt 百变小樱魔法卡 ClearCard 透明牌 提示词实践 Niji 5 Niji6 V6 详细记录 多种风格 附带文本关键词
Midjourney-04 收集Prompt 百变小樱魔法卡 ClearCard 透明牌 提示词实践 Niji 5 Niji6 V6 详细记录 多种风格 附带文本关键词
27 0
|
7月前
|
JavaScript 数据安全/隐私保护 开发者
开源图片编辑器推荐-可用于海报编辑、商品设计、封面设计、标签设计等场景
推荐开源图片编辑器,基于fabric.js和Vue开发,适合海报、Logo等设计场景。拥有4.4K GitHub Stars,特性包括自定义字体、素材、模板,支持插件扩展、右键菜单及快捷键。提供图片滤镜、裁剪、拖拽、PSD导入、水印设置和分类素材管理。适用于非专业设计者,易于二次开发。
开源图片编辑器推荐-可用于海报编辑、商品设计、封面设计、标签设计等场景
|
8月前
显示广告的几种方案及缺点
显示广告的几种方案及缺点
58 0
|
8月前
|
数据采集 人工智能 自然语言处理
ChatGPT系统课程 - 提示词的重点使用场景之内容总结和内容提取
ChatGPT系统课程 - 提示词的重点使用场景之内容总结和内容提取
如何让ChatGPT学习销售过往文字稿,并自动分析话术的优缺点,然后修改?
产品特点、服务优势、目标客户需求和痛点、行业与市场的趋势变化、竞争对手的优劣势、销售场景的特点和要求、销售环境、销售氛围、时间、地点、客户情感需求、心理转态、个性特点、解决方案
339 0
如何让ChatGPT学习销售过往文字稿,并自动分析话术的优缺点,然后修改?
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
从文字到视频:借助ChatGPT与剪映轻松生成高质量视频
从文字到视频:借助ChatGPT与剪映轻松生成高质量视频
385 0
聊天框(番外篇)—如何实现@功能的整体删除
上一篇文章中,我们已经初步实现了聊天输入框,但其@功能是不完善的,例如无法整体删除、无法获取除用户名以外的数据(假设用户名不是唯一的)。有问题就要想办法解决,在网上百度了一圈后,倒是有一些收获。本文就着重解决@的整体删除以及获取额外数据。
1154 0
聊天框(番外篇)—如何实现@功能的整体删除