关于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下面的名字等?自己乱改一通实在无法跟书本输出一致

...全文
450 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
}'

23,107

社区成员

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

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