首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux19-详说linux文本处理(二)

linux19-详说linux文本处理(二)

作者头像
北野茶缸子
发布于 2022-05-19 03:50:46
发布于 2022-05-19 03:50:46
91000
代码可运行
举报
运行总次数:0
代码可运行

前言

继续总结一下linux 的文本处理。包括但不限于awk, sed, paste,split,grep....

接上文[[18-详说linux文本处理(一)]]

1-paste

paste 可以实现类似R 中paste 的功能,不过其是对文件进行操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ paste -d ':' test3 test4
1:10
2:9
3:8
4:7
5:6
6:5
7:4
8:3
9:2
10:1

其主要选项为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-d # 指定文件合并的分隔符,默认为tab
-s # 将文件合并后再转置

如果存在不对齐的情况,则paste 会保留空位:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sed -i '2d' test3

$ paste -s test3 test4
1       3       4       5       6       7       8       9       10
10      9       8       7       6       5       4       3       2       1

paste 还有一个比较好用特性,其可以将一个文件拆分为若干列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test3 | paste - - -
1       3       4
5       6       7
8       9       10

我经常喜欢对比的一个例子是fq 转fa 的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# awk 高级玩家
awk '{if(NR%4 == 1){print ">" substr($0, 2)}}{if(NR%4 == 2){print}}' fastq > fasta

# paste 偷懒玩家
cat fastq | paste - - - - | awk '{print $1"\n"$4}' | tr '@' '>' > fasta

# sed 勤劳玩家
less -S fastq | awk '{print$1}' | sed -n -e '1~4p' -e '2~4p' | sed 's/@/>/' > fasta

2-awk

上面的awk 是不是看起来很复杂,复杂就对了。这玩意儿贼难用。比sed 还难!

awk 和sed 的结构一样,也是三段式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
awk -options script files

awk 的options 中,-F 用来设置字段分隔符。

这里使用数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ head mtcars2.csv
mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
21,6,160,110,3.9,2.62,16.46,0,1,4,4
21,6,160,110,3.9,2.875,17.02,0,1,4,4
22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
18.1,6,225,105,2.76,3.46,20.22,1,0,3,1
14.3,8,360,245,3.21,3.57,15.84,0,0,3,4
24.4,4,146.7,62,3.69,3.19,20,1,0,4,2
22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2

2.1-基本结构

awk 在读取文本时,会将预定义的字段分隔符划分给每个数据字段,并分配一个变量。awk 默认的字段分隔符为任意空白字符(空格或制表符),可以用 -F 参数定义字段分隔符。字段变量对应关系如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$0 代表整个文本行
$1 代表文本中第一个数据字段
...
$NF 代表文本行中的最后一个数据字段

此外,还有如下变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FS # 输入字段分隔符,类似-F 参数设定分隔符;
RS # 输入记录分隔符
OFS # 输出字段分隔符
ORS # 输出记录分隔符
NF # 字段总数,比如列数
NR # 输入记录数,比如行数

结合script 中的print 我们可以打印数据的列数,结合wc 了解数据行列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ wc -l mtcars2.csv; head -1 mtcars2.csv | awk -F ',' '{print NF}'
33 mtcars2.csv
11

2.2-匹配结构

awk 的匹配结构,和sed 类似,通过/xxx/ 来匹配符合字段的行,并返回输出,接着通过print 打印:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat mtcars2.csv | awk -F ',' '/drat/ {print}' 
mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb

2.3-拓展结构

我们可以使用BEGIN 与END 语句来对awk 处理的相关内容进行先后设定,相当于 BEGIN >> awk >> END 对应语句依次进行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat mtcars2.csv | awk -F ',' 'BEGIN{print "---start---"} /18/ {print NR} END{print "---finish---"}'
---start---
4
6
7
11
12
13
14
15
20
23
27
33
---finish---

还可以通过修改内置变量OFS,改变输出分割格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat mtcars2.csv | awk 'BEGIN{FS = ",";OFS="\t"} /18/ {print $1,$NF} END{print "---finish---"}'
22.8    1
18.7    2
18.1    1
19.2    4
17.8    4
16.4    3
17.3    3
15.2    3
30.4    2
15.5    2
27.3    1
21.4    2
---finish---

3-awk高级用法

我们可以将awk 的{} 中的内容,当做一个单独的编程语言。

3.1-条件语句

形如:awk '{if (condition) {yes} else {no}}'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat mtcars2.csv | awk 'BEGIN{FS = ",";OFS="\t"} {if ($2 == 8) {print $1,$NF} else {print "it is not equal to 8"}} END{print "---finish---"}' | head
it is not equal to 8
it is not equal to 8
it is not equal to 8
it is not equal to 8
it is not equal to 8
18.7    2
it is not equal to 8
14.3    4
it is not equal to 8
it is not equal to 8

3.2-循环打印

awk '{for (condition) {statement} }'

3.3-数学运算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat mtcars2.csv | awk 'BEGIN{FS = ",";OFS="\t"} {if ($2 == 8) {print $2-$1}} END{print "---finish---"}' | head
-10.7
-6.3
-8.4
-9.3
-7.2
-2.4
-2.4
-6.7
-7.5
-7.2

直接对列计算处理即可,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+, -, *, ^, /

3.4-过滤模式

比如希望过滤文件的第一行,可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ awk 'NR == 1 {next} {print $0}' file

当然这个操作sed 也可以实现。

3.5-其他用法

-F 参数可以指定正则,设定多个分隔符,比如:[\t,]

4-tr

将字符进行替换压缩和删除。

  • 替换字符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo -e 'good \t good' | tr '\t' ';'
good ; good
  • 正则语法,大小写替换
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
hello world
# ‘A-Z’ 和 ‘a-z’都是集合,集合是可以自己制定的,例如:’ABD-}’、‘bB.,’、‘a-de-h’、‘a-c0-9’都属于集合,集合里可以使用’‘、’,可以可以使用其他ASCII字符。
  • 删除字符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "hello 123 world 456" | tr -d '0-9'
hello  world 

5-join

数据库或者其他编程语言中的join 非常类似,就是将文件通过相同的行连接在一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd /home/shiyanlou
# 创建两个文件
$ echo '1 hello' > file1
$ echo '1 shiyanlou' > file2
$ join file1 file2
# 将/etc/passwd与/etc/shadow两个文件合并,指定以':'作为分隔符
$ sudo join -t':' /etc/passwd /etc/shadow
# 将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对第4和第3个字段
$ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group

# 也就是以: 分隔passwd 与group 中的内容,其中取前者的第四段和后者的第三段合并

题外话

搜索引擎是个好东西,不会查一下就好了:

如果你想了解awk 与sed,有一本书:

要学习更多的命令,可以参考:Linux 命令大全 | 菜鸟教程[1]

utools 也有个好用的插件:

参考资料

[1]

Linux 命令大全 | 菜鸟教程: https://www.runoob.com/linux/linux-command-manual.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
利用Python做一个漂亮小姐姐词云跳舞视频
B站上的漂亮的小姐姐真的好多好多,利用 you-get 大法下载了一个 B 站上跳舞的小姐姐视频,利用视频中的弹幕来制作一个漂亮小姐姐词云跳舞视频,一起来看看吧。
叶庭云
2021/02/02
1K0
python爬虫︱百度百科的requests请求、百度URL格式、网页保存、爬虫模块
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/79475335
悟乙己
2019/05/26
2.4K0
如何编写一个SQL注入工具
  一直在思考如何编写一个自动化注入工具,这款工具不用太复杂,但是可以用最简单、最直接的方式来获取数据库信息,根据自定义构造的payload来绕过防护,这样子就可以。
Bypass
2020/02/26
8350
Python接口自动化之requests请求封装
接下来将请求类型都封装起来,自动化用例都可以用这个封装的请求类进行请求,我们将常用的get、post请求封装起来。
可可的测试小栈
2020/05/07
5.8K0
【学习笔记】Python爬虫
URL由协议、主机名、端口、路径、参数、锚点 URLError\HTTPError 后者时前者的子类 用try-except捕获异常
Livinfly
2022/10/26
2.1K0
python打造文件包含漏洞检测工具
user=input('Enter the file you want to read:')
用户7886150
2021/01/13
6120
你用 Python 写过哪些牛逼的程序/脚本?
【导读】:有网友在 Quora 上提问,「你用 Python 写过最牛逼的程序/脚本是什么?」。本文摘编了 3 个国外程序员的多个小项目,含代码。 Manoj Memana Jayakumar, 30
小小科
2018/05/04
1.1K0
你用 Python 写过哪些牛逼的程序/脚本?
python requests
Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
forxtz
2022/05/10
1.8K0
Python头像动漫化,快来生成一个自己的动漫头像吧
很多时候我们都会为头像发愁,像我这种万年不换头像的咸鱼从来没有这种烦恼。但是吧,有个个性化的头像还是非常有趣的,因为这个抠鼻屎的头像除了抠鼻屎这点,其它都很符合本人的气质,所以已经够用了。但是我还是打算把这个小技巧给大家分享。
ZackSock
2020/05/18
1.2K0
Python头像动漫化,快来生成一个自己的动漫头像吧
Python爬虫准备:认识urllib/urllib2与requests
首先说明一下我的爬虫环境是基于py2.x的, 为什么用这个版本呢,因为py2.x的版本支持的多,而且一般会使用py2.x环境,基本在py3.x也没有太大问题,好了,进入正题!
龙哥
2018/10/22
5010
用Jetson NANO做个智能电视机,这个操作有点意思
印度有个小哥哥用Jetson NANO做了一个智能电视机,怎么个智能法儿呢? 各位请看—— 走到电视机面前,电视就正常播放,离开电视机,电视就暂停 http://mpvideo.qpic.cn/0b
GPUS Lady
2020/10/28
1.4K0
用Jetson NANO做个智能电视机,这个操作有点意思
Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据
导读:常见的数据来源和获取方式,你或许已经了解很多。本文将拓展数据来源方式和格式的获取,主要集中在非结构化的网页、图像、视频和语音。
IT阅读排行榜
2018/08/16
2.4K0
Python "爬虫"出发前的装备之二数据先行( Requests 模块)
这种程序有自己特定的功能,能按照使用者给定的一系列规则自行浏览万维网并获取需要的信息。此类程序被称为 网络爬虫(web crawler) 或 网络蜘蛛(spider)。它具有智能分析能力,也称为 机器人程序 。
一枚大果壳
2022/08/23
5290
Python Requets库学习总结
快速开始 发送请求 >>> import requests >>> r = requests.get('https://api.github.com/events') # GET >>> r = requests.post('https://httpbin.org/post', data={'key': 'value'}) # POST >>> r = requests.put('https://httpbin.org/put', data={'key': 'value'}) # PUT >>> r = r
授客
2023/05/02
1.5K0
python 爬虫基础知识(继续补充)
HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。
py3study
2020/01/19
8960
NDK--利用Camera和AudioRecord实现直播推流
当rtmp连接建立后,native层会回调方法:onPostNativeState,最终在PushHelper中调用VideoPush的startPush方法,该方法开启摄像头预览,将参数传给native层,并会不断调用onPreviewFrame方法将摄像头数据传递给native层。
aruba
2021/04/07
2.6K0
NDK--利用Camera和AudioRecord实现直播推流
PHP代码审计笔记--XSS跨站脚本
这边代码逻辑中,问题根源在于最后一句的url解码输出,导致存在三重url编码绕过的情况。
Bypass
2019/07/08
9600
PHP代码审计笔记--XSS跨站脚本
python三方库之requests-快速上手
其他请求接口与HTTP请求类型一致,如PUT, DELETE, HEAD, OPTIONS等。
枇杷李子橙橘柚
2019/05/26
7050
Python爬虫利器:Requests库的使用
写了一些爬虫,从urllib库转到requests库,到目前为止,个人感觉requests库是最简单易用的HTTP库,以下这段话来自requests官网:
王强
2018/08/09
9550
PJSIP实现转发RTSP流视频
该功能实现,主要需要考虑RTSP取摄像头视频流,拆RTP包,组H264帧,通过PJSIP的视频通道转发;这个过程中,涉及到RTP通道保活,RTSP通道保活;调试时间多耗费在对摄像头返回的RTP数据包的拆解和重新组H264帧上面。
呱牛笔记
2024/03/10
5760
PJSIP实现转发RTSP流视频
推荐阅读
相关推荐
利用Python做一个漂亮小姐姐词云跳舞视频
更多 >
LV.2
专业逮虾户学生
目录
  • 前言
  • 1-paste
  • 2-awk
    • 2.1-基本结构
    • 2.2-匹配结构
    • 2.3-拓展结构
  • 3-awk高级用法
    • 3.1-条件语句
    • 3.2-循环打印
    • 3.3-数学运算
    • 3.4-过滤模式
    • 3.5-其他用法
    • 4-tr
  • 5-join
  • 题外话
    • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档