当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 15 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 16:15 

注册: 2010-07-17 14:01
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
请教多行文本关联处理的方法.

一个文件有多行, 编排的情况可能如下.
行号. 内容:
1. 姓名:
2. 年龄:
3. ...
4. ...
5. 姓名:
6: 年龄:
7...

目的:
读取每一行, 当发现包含姓名, 则把姓名取出来, 放到变量A, 再找下一行, 必须为该姓名对应的年龄, 放到变量B, 把A和B组成一行, 添加到一个输出文件中.
继续读取下面一行, 直到文件结束.

基本考虑用shell, sed 来处理, 但感觉处理比较复杂, 哪位能提供比较好的建议.


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 16:24 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
类似的问题已经在某个帖子里讨论过了。。。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 16:48 

注册: 2010-07-17 14:01
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
能告知是哪个吗? 我没找到


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 18:42 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
guangjian 写道:
能告知是哪个吗? 我没找到

找得累死我了~~

viewtopic.php?f=163&t=228131


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 20:21 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
guangjian 写道:
请教多行文本关联处理的方法.

一个文件有多行, 编排的情况可能如下.
行号. 内容:
1. 姓名:
2. 年龄:
3. ...
4. ...
5. 姓名:
6: 年龄:
7...

目的:
读取每一行, 当发现包含姓名, 则把姓名取出来, 放到变量A, 再找下一行, 必须为该姓名对应的年龄, 放到变量B, 把A和B组成一行, 添加到一个输出文件中.
继续读取下面一行, 直到文件结束.

基本考虑用shell, sed 来处理, 但感觉处理比较复杂, 哪位能提供比较好的建议.


你没交代清楚,你这个文件除了姓名,年龄是否还有别的内容?比如:
代码:
 姓名: a
 年龄:23
 姓名: ab
 年龄:13
 姓名: ac
 年龄:30


还是:
代码:
 姓名: a
 年龄:23
 子女:0
 配偶: 8
 姓名: ab
 年龄:13
 子女:10
 配偶: 0
 姓名: ac
 年龄:30
 子女:2
 配偶: 1


就说第一种,因为简单,呵呵。 :em02
其实不用你说的弄那么多变量,你不就是要把相应的姓名年龄放一行么,这样行么?
代码:
kent$ awk  '{printf NR%2? $0 ", ":$0 "\n"}' t.txt
姓名: a, 年龄:23
姓名: ab, 年龄:13
姓名: ac, 年龄:30


_________________
---
regards,

Kent


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 21:04 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
我一般喜欢适应不同文本格式通用写法:
kose5@kose5-Aspire-4552:~$ cat t.txt
*
姓名: a
年龄:23
子女:0
配偶: 8
有小三
*
姓名: ab
年龄:13
子女:10
配偶: 0
姓名: ac
年龄:30
子女:2
配偶: 1
kose5@kose5-Aspire-4552:~$ awk '{if (match($0,"姓名")) a=$0; if (match($0,"年龄")) print a " " $0}' t.txt
姓名: a 年龄:23
姓名: ab 年龄:13
姓名: ac 年龄:30
kose5@kose5-Aspire-4552:~$


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 21:46 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
在你基础上来个排错的:

代码:
*
姓名: a
年龄:23
年龄:23xxxxxxx000000
姓名: axxxxxxxxxxxxxx
姓名: bxxxxxxxxxxxxxx
子女:0
配偶: 8
有小三
*
姓名: ab
年龄:13
子女:10
配偶: 0
姓名: ac
年龄:30
子女:2
配偶: 1


代码:
awk  '{a=($0~"姓名")?$0:a; if($0~"年龄"){ a=a", "$0; if(a~"姓名" && a~"年龄")print a;a=""}}' t.txt
姓名: a, 年龄:23
姓名: ab, 年龄:13
姓名: ac, 年龄:30


_________________
---
regards,

Kent


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 22:05 

注册: 2010-07-17 14:01
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
多谢各位, 受益匪浅那. awk功能的确很强大.


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 22:07 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
awk直接可以分段。
当然,不如perl强。lol


_________________
● 鸣学


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 22:16 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
另一种方式:
kose5@kose5-Aspire-4552:~$ cat t.txt
*
姓名: a
年龄:23
年龄:23xxxxxxx000000
姓名: axxxxxxxxxxxxxx
姓名: bxxxxxxxxxxxxxx
子女:0
配偶: 8
有小三
*
姓名: ab
年龄:13
子女:10
配偶: 0
姓名: ac
年龄:30
子女:2
配偶: 1
kose5@kose5-Aspire-4552:~$ awk '{if (match($0,"姓名")) {a=$0;b=NR} if (match($0,"年龄")) {if (NR == (b+1)) print a " " $0}}' t.txt
姓名: a 年龄:23
姓名: ab 年龄:13
姓名: ac 年龄:30
kose5@kose5-Aspire-4552:~$


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 22:22 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
awk -F 姓名

直接分段。


_________________
● 鸣学


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-20 23:17 

注册: 2010-07-17 14:01
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
希望产生下面的输出, 前面的实现好像还差一点.
Input:
cat test.txt
tesateta
asdfasdf
asdfasdf:asfasd
asdfasdf:asdfads
姓名:aaa
年龄:bbb
成绩:88
tset
asdfasdf
ass
姓名:ccc
年龄:ddd
成绩:98
asdfasdf


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-21 17:15 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
guangjian 写道:
希望产生下面的输出, 前面的实现好像还差一点.
Input:
cat test.txt
tesateta
asdfasdf
asdfasdf:asfasd
asdfasdf:asdfads
姓名:aaa
年龄:bbb
成绩:88
tset
asdfasdf
ass
姓名:ccc
年龄:ddd
成绩:98
asdfasdf


你到底说的是输入还是输出阿? 一帮人折腾了半天,发现还没明白你想要的是什么。。。。 :em20


_________________
---
regards,

Kent


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-22 10:01 
头像

注册: 2006-10-25 18:08
帖子: 1582
送出感谢: 0 次
接收感谢: 0 次
动不动就循环,就数组,看的老衲蛋疼
cat test.txt
tesateta
asdfasdf
asdfasdf:asfasd
asdfasdf:asdfads
姓名:aaa
年龄:bbb
成绩:88
tset
asdfasdf
ass
姓名:ccc
年龄:ddd
成绩:98
asdfasdf

grep -E '姓名|年龄' test.txt | sed 'N;s/\n/\t/'
姓名:aaa 年龄:bbb
姓名:ccc 年龄:ddd


_________________
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 请教多行文本关联处理的方法.
帖子发表于 : 2011-04-23 0:03 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
有排错的比较好:
kose5@kose5-Aspire-4552:~$ grep -E '姓名|年龄' t.txt|tr "\n" " "|grep -o '姓名[^姓年]*年龄[^姓年]*'
姓名: a 年龄:23
姓名: ab 年龄:13
姓名: ac 年龄:30
kose5@kose5-Aspire-4552:~$
不管想输出什么,加上就是,不管什么指令,骨子里算法一样。


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 15 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译