这两天做《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处理文本的小栗子的更多相关文章

  1. Pyp 替代sed,awk的文本处理工具

    Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...

  2. 【Linux进阶】使用grep、find、sed以及awk进行文本操作

    目录 一.元字符 二.grep命令 1. 过滤出包含某字符串的行 2. 过滤出以某字符串开头(结尾)的行 3. 过滤出包含某字符串及其相邻的行 4. 过滤出不包含某关键字的行 5. 过滤出包含多个字符 ...

  3. shell脚本之使用sed和awk进行文本处理

    Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义.针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助.此篇文档作用就是在 ...

  4. Linux文本三剑客超详细教程---grep、sed、awk

    awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...

  5. awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一

    awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...

  6. 三大文本处理工具grep、sed及awk的简单介绍

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...

  7. Linux 文本处理工具grep,sed,awk

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...

  8. shell之三大文本处理工具grep、sed及awk

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...

  9. 三大文本处理工具grep、sed及awk

    一.   用grep在文件中搜索文本 grep能够接受正则表达式,生成各种格式的输出.除此之外,它还有大量有趣的选项. 1.  搜索包含特定模式的文本行: 2.  从stdin中读取: 3.  单个g ...

随机推荐

  1. 30天轻松学习javaweb_通过telnet连接http服务器

    telnet是windows自带的网络连接工具,可以用于连接任何服务器. 通过Telnet连接服务端 Telnet localhost 8080GET /news/1.html HTTP/1.1Hos ...

  2. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  3. Django – query not equal

    The simpliest way to retrieve data from tables is take them all. To do this,  you can write: 1 all_e ...

  4. 【原】rsync的详细参数

    rsync参数的具体解释如下: -v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关,强制对文件传输进行校验-a, --archive ...

  5. Android——进度条ProgressBar

    1.activity_progressbar.xml <?xml version="1.0" encoding="utf-8"?><Linea ...

  6. iOS UILabel详解

    1.创建 CGRect rect = CGRectMake(100, 200, 50, 50); UILabel *label = [[UILabel alloc] initWithFrame:rec ...

  7. C# 泛型List用法

    C# List Examples by Sam Allen - Updated September 6, 2009 Problem. You have questions about the List ...

  8. 解决setInterval计时器不准的问题

    在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在s ...

  9. Flash图表控件FusionCharts自定义图表y轴最大/最小值

    自定义图表y轴的最大值和最小值 用户可以使用FusionCharts图表中<chart>元素的yAxisMaxValue和yAxisMinValue属性设置图表限制. 示例: <ch ...

  10. 【PL/SQL练习】自定义异常

    由用户自己定义1.定义异常名称,类型exception2.举出异常(raise excepttion)3.捕获异常 SQL> declare e_user_err exception; v_de ...