关于sed和awk使用问题,实测无法达到书本描述效果

常书 2017-10-13 12:28:18
正在学习:《sed与awk(第二版)》
其中第39页有一个使用sed和awk的例子,如下:
文件list内容如下:

John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

文件nameState内容如下:

s/CA/, California/
s/MA/, Massachusetts/
s/OK/, Oklahoma/
s/PA/, Pennsylvania/
s/VA/, Virginia/

文件ByState内容如下:

#!/bin/sh
awk -F, '{
print $4 ", " $0
}' $* |
sort |
awk -F, '
$1 == LastState {
print " \t" $2
}
$1 != LastState {
LastState = $1
print $1
}'

书上提到使用如下命令执行

sed -f nameState list |byState

执行后得到结果为:

California
Amy Wilde
Massachusetts
Eric Adams
John Daggett
Sal Carpenter
Oklahoma
Orville Thomas
Pennsylvania
Terry Kalkas
Virginia
Alice Ford
Hubert Sims

我在ubuntu 14.04LTS中运行结果如下:

California
Massachusetts
  John Daggett
  Sal Carpenter
Oklahoma
Pennsylvania
Virginia
  Hubert Sims

问题1:http://bbs.chinaunix.net/thread-3763501-1-1.html这篇贴子2楼回复说“&hairsp”就是字面意思,如果是这样,为嘛书上的例子执行结果没有&hairsp?感觉这符号应该是想输出部分空格(hair space),是不是在ubuntu下有类似的空格输出语句呢(我把&hairsp换成4个空格,输出就跟书本上的类似)?
问题2:
为什么我的输出会比书本上的输出少了California下面的名字等?自己乱改一通实在无法跟书本输出一致

...全文
453 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
龟叔啊 2017-11-15
  • 打赏
  • 举报
回复
赞同楼上的学习态度,不弄明白怎么能走的更远!
常书 2017-11-15
  • 打赏
  • 举报
回复
不死心再次GOOGLE了下,总算找到答案,如下: http://www.sagehill.net/docbookxsl/SpecialChars.html HAIR SPACE     Thinner than a thin space.  表示短空格,为unicode 200A 验证如下: 1m->echo -e hello\\u200Aworld hello  world 结贴散分
常书 2017-11-15
  • 打赏
  • 举报
回复
引用 6 楼 cy309173854 的回复:
我觉得吧,不用读死书,活学活用。
我有强迫症,只求一解,您要是知道,给个答案吧,百度GOOLE都找不到&hairsp是个什么鬼
曹宇飞丶 2017-11-06
  • 打赏
  • 举报
回复
我觉得吧,不用读死书,活学活用。
常书 2017-11-01
  • 打赏
  • 举报
回复
脚本中我不理解的就是“&hairsp”这个表示什么意思,在UBUNTU14.04里,这个符号不起作用
引用 4 楼 cy309173854 的回复:
#!/bin/sh awk -F, '{ print $4 ", " $0 }' $* | sort | awk -F, ' $1 == LastState { print "\t" $2 } $1 != LastState { LastState = $1 print $1 print "\t" $2 }' 不用额外加空格,如果不理解整个脚本的话,可以把脚本拆分了,一条条执行,看下效果加深理解。 像这样: cat list|awk -F , '{print $4 ", " $0}' $*|sort|awk -F, '$1 == LastState {print "\t" $2}'
曹宇飞丶 2017-10-19
  • 打赏
  • 举报
回复
#!/bin/sh awk -F, '{ print $4 ", " $0 }' $* | sort | awk -F, ' $1 == LastState { print "\t" $2 } $1 != LastState { LastState = $1 print $1 print "\t" $2 }' 不用额外加空格,如果不理解整个脚本的话,可以把脚本拆分了,一条条执行,看下效果加深理解。 像这样: cat list|awk -F , '{print $4 ", " $0}' $*|sort|awk -F, '$1 == LastState {print "\t" $2}'
LubinLew 2017-10-19
  • 打赏
  • 举报
回复
因为 脚本时错的啊,

#!/bin/sh
awk -F, '{
        print $4 ", " $0
         }' $* |
sort |
awk -F, '
$1 != LastState {
    LastState = $1
    print $1
}
$1 == LastState {
	print "\t"$2
}
'

常书 2017-10-17
  • 打赏
  • 举报
回复
顶顶,没有大神回复下吗
常书 2017-10-13
  • 打赏
  • 举报
回复
第2个问题已解决,书本上的awk脚本不完整,完整脚本如下:

#!/bin/sh
awk -F, '{
        print $4 ", " $0
         }' $* |
sort |
awk -F, '
$1 == LastState {
    print "    \t" $2
}
$1 != LastState {
    LastState = $1
    print $1
    print "    \t" $2
}'
sedawk是用户、程序员和管理员应用的工具。之所以称为sed是因为它是一个流编辑器(stream editor),用于对许多文件执行一系列的编辑操作。awk是根据它的开发者Aho、Weinberger和Kernighan命名的。awk是一种编程语言,它可以使你很容易地处理结构化数据和生成格式化报告。第二版介绍了awk的POSIX标准,同时介绍了一些可免费使用的以及商业版的awk。 本书在一开始就给出了一个概述和指南,论述了从grep到sed再到awk不断改进的功能。sedawk具有相同的命令行语法,以脚本的形式接收用户的命令。因为所有这三个程序都使用UNIX正则表达式,因此书中用一章的篇幅来介绍UNIX的正则表达式语法。 然后,本书介绍如何编写sed脚本。从编写几行简单的脚本开始,学习进行手工编辑操作的其他基本命令和高级命令,以及由此引入的简单程序结构。这些高级命令包括用于处理保持空间、即一个临时缓冲区的命令。 本书的第二部分经过广泛的修订,包括了POSIX awk,以及3个可免费使用的和3个商业版的awk。本书介绍了awk语言的主要特点以及如何编写简单的脚本。你还能了解到: * 通用的程序结构 * 如何使用awk的内部函数 * 如何编写用户的定义函数 * awk程序的调试技术 * 如何开发一个处理索引的应用程序,该程序演示了awk的强大功能 * 得到不同awk版本的FTP和联系信息 本书还包含了一组用户提供的程序,这些程序展示了广泛的sedawk程序风格和技巧。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧