分页: 1 / 1
请教多行文本关联处理的方法.
发表于 : 2011-04-20 16:15
由 guangjian
请教多行文本关联处理的方法.
一个文件有多行, 编排的情况可能如下.
行号. 内容:
1. 姓名:
2. 年龄:
3. ...
4. ...
5. 姓名:
6: 年龄:
7...
目的:
读取每一行, 当发现包含姓名, 则把姓名取出来, 放到变量A, 再找下一行, 必须为该姓名对应的年龄, 放到变量B, 把A和B组成一行, 添加到一个输出文件中.
继续读取下面一行, 直到文件结束.
基本考虑用shell, sed 来处理, 但感觉处理比较复杂, 哪位能提供比较好的建议.
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 16:24
由 lilydjwg
类似的问题已经在某个帖子里讨论过了。。。
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 16:48
由 guangjian
能告知是哪个吗? 我没找到
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 18:42
由 lilydjwg
guangjian 写了:能告知是哪个吗? 我没找到
找得累死我了~~
viewtopic.php?f=163&t=228131
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 20:21
由 sk1418
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
就说第一种,因为简单,呵呵。
其实不用你说的弄那么多变量,你不就是要把相应的姓名年龄放一行么,这样行么?
代码: 全选
kent$ awk '{printf NR%2? $0 ", ":$0 "\n"}' t.txt
姓名: a, 年龄:23
姓名: ab, 年龄:13
姓名: ac, 年龄:30
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 21:04
由 fnan
我一般喜欢适应不同文本格式通用写法:
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:~$
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 21:46
由 sk1418
在你基础上来个排错的:
代码: 全选
*
姓名: 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
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 22:05
由 guangjian
多谢各位, 受益匪浅那. awk功能的确很强大.
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 22:07
由 eexpress
awk直接可以分段。
当然,不如perl强。lol
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 22:16
由 fnan
另一种方式:
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:~$
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 22:22
由 eexpress
awk -F 姓名
直接分段。
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-20 23:17
由 guangjian
希望产生下面的输出, 前面的实现好像还差一点.
Input:
cat test.txt
tesateta
asdfasdf
asdfasdf:asfasd
asdfasdf:asdfads
姓名:aaa
年龄:bbb
成绩:88
tset
asdfasdf
ass
姓名:ccc
年龄:ddd
成绩:98
asdfasdf
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-21 17:15
由 sk1418
guangjian 写了:希望产生下面的输出, 前面的实现好像还差一点.
Input:
cat test.txt
tesateta
asdfasdf
asdfasdf:asfasd
asdfasdf:asdfads
姓名:aaa
年龄:bbb
成绩:88
tset
asdfasdf
ass
姓名:ccc
年龄:ddd
成绩:98
asdfasdf
你到底说的是输入还是输出阿? 一帮人折腾了半天,发现还没明白你想要的是什么。。。。

Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-22 10:01
由 trigger
动不动就循环,就数组,看的老衲蛋疼
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
Re: 请教多行文本关联处理的方法.
发表于 : 2011-04-23 0:03
由 fnan
有排错的比较好:
kose5@kose5-Aspire-4552:~$ grep -E '姓名|年龄' t.txt|tr "\n" " "|grep -o '姓名[^姓年]*年龄[^姓年]*'
姓名: a 年龄:23
姓名: ab 年龄:13
姓名: ac 年龄:30
kose5@kose5-Aspire-4552:~$
不管想输出什么,加上就是,不管什么指令,骨子里算法一样。