免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3121 | 回复: 10
打印 上一主题 下一主题

[文本处理] tim大神总结的文档有的地方没看懂,帮忙进来看看 [复制链接]

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-25 23:55 |只看该作者 |倒序浏览
原文在这里
http://bbs.chinaunix.net/thread-1790335-1-1.html

没看懂的地方为,下面标红的是不懂的地方,麻烦各位大神帮忙解释一下
当 RS="" 时,会将\n强制加入到FS变量中
ly5066113@ubuntu:~$ cat urfile
1
a

2
a


3
ly5066113@ubuntu:~$ awk -v RS="" '{print "#" $0 "#"}' urfile  /*这里的打印怎么会有换行,FS中加入\n,和print有什么关系*/#1
a#
#2
a#
#3#
ly5066113@ubuntu:~$ awk -F "b" -v RS="" '{print $1}' urfile   /*和我的实验结果不一致呢???*/
1
2
3
ly5066113@ubuntu:~$ awk -F "c" -v RS="" '{print $1}' urfile     /*和我的实验结果不一致呢???*/
1
2
3
ly5066113@ubuntu:~$ awk -F "c" -v RS="\n\n+" '{print "#" $1 "#"}' urfile
#1
a#
#2
a#
#3
#

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-11-25 23:57 |只看该作者
我的实现结果为
awk -F "b" -v RS="" '{print $1}' urfile
1
a
2
a
3
awk -F "c" -v RS="" '{print $1}' urfile
1
a
2
a
3   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
3 [报告]
发表于 2014-11-26 09:30 |只看该作者
召唤各路大神

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2014-11-26 10:00 |只看该作者
本帖最后由 jason680 于 2014-11-26 10:02 编辑

回复 2# super皮波

AWK version issue or your typo ?

$ awk --version
GNU Awk 3.1.8
...

$ cat urfile
1
a

2
a


3

$ awk -F "b" -v RS="" '{print $1}' urfile
1
2
3

$ awk -F "b" -v RS="" '{print $0}' urfile
1
a
2
a
3


#debug by yourself
$ awk -F "b" -vRS="" '{print "NR="NR",NF="NF",FS="FS;for(n=1;n<=NF;n++)print "$"n"=|"$n"|"}' urfile
NR=1,NF=2,FS=b
$1=|1|
$2=|a|
NR=2,NF=2,FS=b
$1=|2|
$2=|a|
NR=3,NF=1,FS=b
$1=|3|

   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
5 [报告]
发表于 2014-11-26 10:02 |只看该作者
回复 4# jason680
哦,昨天测试的时候没看awk版本,忽略这个问题了,多谢!!


   

论坛徽章:
3
天秤座
日期:2014-10-29 11:37:572015元宵节徽章
日期:2015-03-06 15:50:39NBA常规赛纪念章
日期:2015-05-04 22:32:03
6 [报告]
发表于 2014-11-26 14:19 |只看该作者
太公在此,诸神退位

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
7 [报告]
发表于 2014-11-26 15:11 |只看该作者
回复 4# jason680
#debug by yourself
$ awk -F "b" -vRS="" '{print "NR="NR",NF="NF",FS="FS;for(n=1;n<=NF;n++)print "$"n"=|"$n"|"}' urfile
NR=1,NF=2,FS=b
$1=|1|
$2=|a|
NR=2,NF=2,FS=b
$1=|2|
$2=|a|
NR=3,NF=1,FS=b
$1=|3|

这块还是没看懂,还得麻烦你帮着看看,谢谢
tim大神在那篇帖子中说,当RS=""时,会自动将\n加入到FS中
对于上面的awk中有如下两个问题
1.RS为空,所以此时的FS=b\n,为何结果是FS=b(\n哪去了?print本身就隐含了换行,貌似这里有两个空行才符合FS=b\n)   
2.FS=b\n,按照这个分割的话,此时应该只有$1啊,$2是怎么来的

   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
8 [报告]
发表于 2014-11-26 15:23 |只看该作者
再次召唤一波大神

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2014-11-26 17:02 |只看该作者
本帖最后由 jason680 于 2014-11-26 17:50 编辑

回复 7# super皮波

more data and experiment, you'll see what happen

$ cat urfile
1,11
a,a1

2,21
a,a2


3,3a

$ awk -F"," -vRS="" '{print "NR="NR",NF="NF",FS=\""FS"\"";for(n=1;n<=NF;n++)printf "$"n"=|"$n"|,";print""}' urfile
NR=1,NF=4,FS=","
$1=|1|,$2=|11|,$3=|a|,$4=|a1|,
NR=2,NF=4,FS=","
$1=|2|,$2=|21|,$3=|a|,$4=|a2|,
NR=3,NF=2,FS=","
$1=|3|,$2=|3a|,

# set RS by yourself and get the some issue on "\n" (new line)
$ awk -F"," -vRS="\n\n+" '{print "NR="NR",NF="NF",FS=\""FS"\"";for(n=1;n<=NF;n++)printf "$"n"=|"$n"|,";print""}' urfile
NR=1,NF=3,FS=","
$1=|1|,$2=|11
a|
,$3=|a1|,
NR=2,NF=3,FS=","
$1=|2|,$2=|21
a|
,$3=|a2|,
NR=3,NF=2,FS=","
$1=|3|,$2=|3a
|
,

# you can add the "\n"(new line) in FS by yourself
$ awk -F"[,\n]" -vRS="\n\n+" '{print "NR="NR",NF="NF",FS=\""FS"\"";for(n=1;n<=NF;n++)printf "$"n"=|"$n"|,";print""}' urfile
NR=1,NF=4,FS="[,
]"
$1=|1|,$2=|11|,$3=|a|,$4=|a1|,
NR=2,NF=4,FS="[,
]"
$1=|2|,$2=|21|,$3=|a|,$4=|a2|,
NR=3,NF=3,FS="[,
]"
$1=|3|,$2=|3a|,$3=||,

Note: you need to check last item in last line

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
10 [报告]
发表于 2014-11-26 17:54 |只看该作者
回复 9# jason680
我根据试验的结果发现,应该去这样理解tim说的这句话
RS为空时,如果FS为单个字符的话,会自动的将\n加入到FS中

例如此时的FS=“b”

将\n加入到FS中意味着,在分割域的时候可以以b为分割点,也可以以\n分割,两者是或的关系,但是打印FS时,FS还是等于b的
当RS=\n\n+时,\n不会加入到FS中,分割域就是按照b来进行


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP