一个利用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 ...
随机推荐
- CentOS配置网卡,重启网络显示:Device does not seem to be present(转载)
From:http://www.cnblogs.com/fbwfbi/archive/2013/04/29/3050907.html 一.故障现象: [root@c1node01 ~]# servic ...
- 配置webstorm使用supervisor时出现 /usr/bin/env: node: 没有那个文件或目录 解决方法
配置好supervisor路径后 出现了 启动时出现了 /usr/bin/env: node: 没有那个文件或目录 需要讲.nvm下的node链接到, /usr/bin/目录下 sudo ln -s ...
- C - Fractal(3.4.1)
Description A fractal is an object or quantity that displays self-similarity, in a somewhat technica ...
- 使用spring的邮件发送功能
使用spring提供的MailSender和JavaMailSender类. 1.邮件对象类 package cn.luxh.app.mail; import java.util.List; impo ...
- JQuery上传插件uploadify整理(Options)
下载 现在有两个版本了,我此次使用的依然是Flash版本的,虽然现在绝大部分浏览器都兼容HTMKL5,目前位置,除了做手机项目外,一般我们项目中不允许使用HTML5标签. 属性介绍(Options) ...
- H264句法和语法总结(二)NAL层语法
1.NAL全称Network Abstract Layer, 即网络抽象层. 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(N ...
- Java将Unix时间戳转换成指定格式日期
public String TimeStamp2Date(String timestampString, String formats){ Long timestamp = Long.pars ...
- 使用pscp实现Windows 和 Linux服务器间远程拷贝文件
转自:http://www.linuxidc.com/Linux/2012-05/60966.htm 在工作中,每次部署应用时都需要从本机Windows服务器拷贝文件到Linux上,有时还将Linux ...
- Fiddler录制jmeter脚本--V4.4..0.1版本
圣诞节到了,圣诞老人送平安,我们送技术,我们知道以前jmeter的脚本来源有三个,手动书写.badboy录制.自带的录制功能(jmeter3.0该功能还比较好),目前我们又多了一个fiddler生 ...
- Orchard官方文档翻译(七) 导航与菜单
原文地址:http://docs.orchardproject.net/Documentation/Navigation-and-menus 想要查看文档目录请用力点击这里 最近想要学习了解orcha ...