一个利用sed和awk处理文本的小栗子
这两天做《Linux操作系统》课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享。
首先说题目是这样的,有这样一段文本:
RECORD
#这是多余的注释行one
#record_type students
#这是多余的注释行two
F sno
F name 王铁蛋
F gender 男
F age
F class 网络工程01
F region 湖北省武汉市
.
RECORD
#这是多余的注释行one
#record_type scores
#这是多余的注释行two
F sno
F mathematics
F english
F chinese
F history
F politics
然后要我们利用sed和awk,改啊改,改成这个样子:

这个怎么做呢,首先就是要去掉那个多余的注释行,那个很好去掉,就是利用sed的正则表达式判断就好了,以#开头的,且后面跟着的不是r这个字符,那么就把这行删除,具体命令如下:

这样就可以去掉多余的注释行了。
接下来我们就要进入主题了,利用awk来对文本进行处理。
根据结果来看,可以看到这个题目中awk其实一共录入了两个record,也就是说我们的记录分隔符RS不能再用回车了,得用原文本中的那个点,同时,每条记录中的每个域应该就是record行到“.”行的每一行,所以我们的域分隔符也应该换一下,变成回车。所以awkBEGIN时执行命令应该是这两条。

接下来就得要分析,如何打印开头的那个Record (1) “students”了,括号里面的那个数字应该是当前记录号,而后面的那个students应该是取自record_type那一行,这个具体要怎么做呢,其实很简单,如下:

用for循环分别取出每个域,然后判断,如果以#开头,那么则说明是#record_type 那一行,我们就对这一行利用gsub函数进行处理。
那个gsub函数是干嘛的呢,其实就是一个替换(substitute)函数,它利用第一个参数里的正则表达式来对第三个参数进行查找,将查找到的内容用第二个参数进行替换。具体到本栗子中就是,查找以#开头空格结束这么一段内容,然后用空字符串进行替换。这样其实就是做了一个删除的功能。这样处理之后,#record_type students就变成了students了,然后我们再来进行输出就好了,需要注意的是,print函数类似于c语言的printf函数,可以直接对字符串进行连接,所以上面那个print第二个参数其实就是输出了“students”。
输出了头之后,我们就该输出中间的内容了,我们可以很容易地发现一个规律就是所有内容都是以F开头的,所以这里我们就可以这样处理。

首先判断这个域的内容是不是以F开头的,如果是,则进行处理。
中间那个split函数的功能就是进行分割,对$i字符串的内容以第三个参数空格进行分割,然后将分割的结果存放到第二个参数所代表的数组中,然后再来将内容输出就好了。
整个for循环结束之后,再来打印一遍这条记录结束了,这样就能实现我们的功能了。
最后再把代码整体贴一遍,希望对各位有所帮助:
#!/bin/bash
#History:
# Michael 4月,, sed '/#[^r].*/d' recordmdA.txt | \ awk '
BEGIN {
RS="."
FS="\n"
}
{
for(i=;i<=NF;i++)
{
if($i ~ /#.*/)
{
gsub(/#.* /,"",$i)
print "Record ("NR")","\""$i"\""
}
else if($i ~ /F.*/)
{
split($i,A," ")
print "\t""\""A[]"\"""=""\""A[]"\""
}
}
print "End of Record ("NR")"
}
' # gsub函数的功能就是通过第一个参数的正则表达式在第三个参数中查找特定字符串,然后用第二个参数来替换这个字符串,具体到本例中就是将#record_type score字符串中空格前面的内容全部删掉 # split函数的功能就是分割,通过第三个参数来将第一个参数的内容进行分割,并将分割的结果存放到第二个参数所代表的数组中
一个利用sed和awk处理文本的小栗子的更多相关文章
- Pyp 替代sed,awk的文本处理工具
Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...
- 【Linux进阶】使用grep、find、sed以及awk进行文本操作
目录 一.元字符 二.grep命令 1. 过滤出包含某字符串的行 2. 过滤出以某字符串开头(结尾)的行 3. 过滤出包含某字符串及其相邻的行 4. 过滤出不包含某关键字的行 5. 过滤出包含多个字符 ...
- shell脚本之使用sed和awk进行文本处理
Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义.针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助.此篇文档作用就是在 ...
- Linux文本三剑客超详细教程---grep、sed、awk
awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...
- awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一
awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...
- 三大文本处理工具grep、sed及awk的简单介绍
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- Linux 文本处理工具grep,sed,awk
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- shell之三大文本处理工具grep、sed及awk
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- 三大文本处理工具grep、sed及awk
一. 用grep在文件中搜索文本 grep能够接受正则表达式,生成各种格式的输出.除此之外,它还有大量有趣的选项. 1. 搜索包含特定模式的文本行: 2. 从stdin中读取: 3. 单个g ...
随机推荐
- 打造高性能Java应用需掌握的5大知识
这篇文章节选自<java performance>,对java性能比较关心的同学大概都知道这本书,性能这个东西可能是很多同学在日常写java code的时候很少去关心的,但是在我们写cod ...
- Opencv 2.4.9在Ubuntu下的配置与安装
[原]Opencv 2.4.9在Ubuntu下的配置安装 Opencv 2.4.9在Ubuntu下的配置与安装 surgewong@gmail.com http://blog.csdn.net/su ...
- Struts中<s:checkboxlist>的用法
一.JSP中 ①集合为list <s:checkboxlist name="list" list="{'Java','.Net','RoR','PHP'}" ...
- Rspec中describe和context不同
转自 http://lmws.net/describe-vs-context-in-rspec 学习rspec,不太理解describe和context.google了一下,找到这篇文章,感觉说的有 ...
- linux secureCRT utf-8编码显示
secureCRT 会话选项-终端-外观-字符编码: 下拉选择UTF-8 关闭当前secureCRT,另开一个新的让设置生效,显示正常.
- 在AE中通过指定中心点和半径画圆
/// <summary>/// 通过指定的中心点.半径画圆/// </summary>/// <param name="pLayer">要画的 ...
- 03-position和anchorPoint
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- C++ 之旅:前言
日前,拿起了C++教材开始学习. 在大学二年级的时候,其实C++已经是我们的必修课程.然而,那时的我刚从C语言的噩梦中逃出来,对C++也不甚喜爱.刚接触编程的我当时实在无法理解譬如下面这段 int x ...
- Appnium移动自动化框架初探
作者:cryanimal QQ:164166060 本文简要介绍了appnium自动化框架的架构.加载流程.支持语言.相关配置,以及元素定位工具等. 官方网站: http://appium.io Ap ...
- 业务gis 怎么让别的开发人员不需要懂gis就可以搞开发? (五)
我们稍微搭建了一个比较简单的图形使用模板,flex端操作这里我就不说了,按大家喜好写,最后javascript部分可以通过jsduck工具生成一个开发文档给业务开发人员,前提注释部分要写好,要公开的注 ...