一个利用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 ...
 
随机推荐
- dom4j-full.jar 解析 XML
			
dom4j-full.jar 解析 XML public Document getDocument() throws DocumentException { SAXReader read=new SA ...
 - View的缩放操作--CGAffineTransformMakeScale:
			
__weak UIImageView *weekImage = imageView; imageView.transform = CGAffineTransformMakeScale(0.1, 0.1 ...
 - 第6章 System V消息队列
			
6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...
 - 20145305 《Java程序设计》第3周学习总结
			
教材学习内容总结 1."一类一文件" 2.参考名称与对象数据成员同名时,可以在数据成员前使用this区别 3.不能用==直接比较浮点数运算结果 4.=是用在指定参考名称参考某个对象 ...
 - 使用commons-codec包加密字符串(MD5,SHA1,BASE64)
			
1. [代码]MD5 String str = "abc"; DigestUtils.md5Hex(str); //附.net生成MD5的方法,生成内容跟java一致: Strin ...
 - Mingyang.net:格式化Hibernate的SQL输出语句
			
在sping与hibernate整合中可以这样的设置 <property name="hibernateProperties"> <props> <p ...
 - java的新窗体
			
1.JFrame窗体 jf.setSize(200, 150); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ...
 - Unable to open serial port /dev/ttyUSB0
			
ubuntu12.04使用USB转串口时出现权限不够问题,如下 Unable to open serial port /dev/ttyUSB0 权限不够 解决办法: 通过增加udev规则来实现.步骤如 ...
 - 深度解析EM菌
			
现在,在各大水族论坛里知道什么是EM菌的人不多,能正确说出EM菌的原理.成分和用途的人更是凤毛麟角,很多人对EM菌是否适用于水族箱存有疑虑,他们认为EM菌里大部分都是厌氧菌,因此不适合在水族箱这种好氧 ...
 - OC基础(16)
			
autorelease基本使用 autorelease注意事项 *:first-child { margin-top: 0 !important; } body > *:last-child { ...