[二星]格式化输出,欢迎各种脚本或者语言

除了美化之外,还可以来尝试挑战一下任务
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

[二星]格式化输出,欢迎各种脚本或者语言

#1

帖子 eexpress » 2009-09-23 10:28

#CONTACT
ID=454
NAME=Fred Weinhaus
CREATED=1251770526
MAIL=fmw@alink.net
ICON=Contact0

#CONTACT
ID=455
NAME=binsos@googlegroups.com
CREATED=1253364946
MAIL=binsos@googlegroups.com
DESCRIPTION=
SHORT NAME=
PHONE=1xxxxx999901
ICON=Contact0
取name phone同时有效的,组成行。
● 鸣学
头像
tenzu
论坛版主
帖子: 36913
注册时间: 2008-11-21 20:26
送出感谢: 0
接收感谢: 21 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#2

帖子 tenzu » 2009-09-23 10:41

纯帮顶
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#3

帖子 yaoms » 2009-09-23 11:38

代码: 全选

awk -F[=] 'BEGIN{i=0}$1=="#CONTACT"{i++}$1=="NAME"{n[i]=$2}$1=="PHONE"{p[i]=$2}END{for(i in n){if (n[i] && p[i]) printf "%s, %s\n",n[i],p[i]}}' data.txt
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#4

帖子 yaoms » 2009-09-23 11:40

同理,用 perl 也可以模拟出一个,
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
cnkilior
论坛版主
帖子: 4979
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#5

帖子 cnkilior » 2009-09-23 11:59

代码: 全选

#!/bin/sh

#ALL Variables 
cleaner(){
     ID=
     NAME=
    .
    .
    .   #需要补全,我偷个懒好吧!
}
writer(){
echo ${NAME},$PHONE >>whereyouneed
}
while read LINE;do 
    case "$LINE" in
         "")
             continue
             ;;
          \#CONTACT)
                writer
                cleaner
                ;;
            *)
                 eval $LINE
                 ;;
        esac
done

#remove the head.
sed -i '^,$/d' whereyouneed
上次由 cnkilior 在 2009-09-23 12:40,总共编辑 2 次。
头像
cnkilior
论坛版主
帖子: 4979
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#6

帖子 cnkilior » 2009-09-23 12:00

当然也可以不要最后一句话,可以在write函数中判断一下是不是有变量是空就可以了。这样应该更好些!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#7

帖子 eexpress » 2009-09-23 12:13

3楼无输出。5楼死机。呵呵
● 鸣学
头像
oneleaf
论坛管理员
帖子: 10237
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 107 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#8

帖子 oneleaf » 2009-09-23 12:27

代码: 全选

#!/bin/python
import re
r=r'ID.*?ICON'
d=open("a.txt").read()
g=re.findall(r,d,re.S)
for a in g:
    r=r'MAIL=(.*?)\n.*?PHONE=(.*?)\n'
    x=re.search(r,a,re.S)
    if x : print "%s,%s"%(x.group(1),x.group(2))
头像
cnkilior
论坛版主
帖子: 4979
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#9

帖子 cnkilior » 2009-09-23 12:33

eexpress 写了:3楼无输出。5楼死机。呵呵
一个小小的脚本还会死机?

开什么玩笑了。

sh a.sh yourfile

你不会是没有补全cleaner里面的...吧,我偷懒写个函数,你运行的时候就要去补全啊!

我没有试过。死不死机我不知道,看这个XXX=yyy的架势就知道用eval。

也可能是write这个函数和一个命令重名了。没有考虑到这个问题。
上次由 cnkilior 在 2009-09-23 12:39,总共编辑 4 次。
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#10

帖子 yaoms » 2009-09-23 12:33

eexpress 写了:3楼无输出。5楼死机。呵呵
为什么、?我试过的啊
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#11

帖子 yaoms » 2009-09-23 12:36

ee人品问题
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

Re: ★★格式化输出,欢迎各种脚本或者语言

#12

帖子 bones7456 » 2009-09-23 12:51

代码: 全选

awk -F= '$1=="ID"{if(N&&P)print N","P;N="";P=""}$1=="NAME"{N=$2}$1=="PHONE"{P=$2}END{if(N&&P)print N","P;}' txt
关注我的blog: ε==3
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#13

帖子 eexpress » 2009-09-23 13:03

8楼的,没判断2个都有效而已。至少可执行输出。而且是NAME 和 PHONE。这到无所谓。

5楼死机
傻了吧。是说无输出,不结束。呵呵

12楼继续无输出。

ptw: 为什么大家都不用ARGV $1 这些的哦。
● 鸣学
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: ★★格式化输出,欢迎各种脚本或者语言

#14

帖子 lilydjwg » 2009-09-23 13:14

代码: 全选

#!/usr/bin/env python3
# fileencoding=utf-8

name = phone = None
with open('data.txt') as f:
  for i in f:
    if i.find('#CONTACT') != -1:
      another = True
      name = phone = None
    if i.startswith('NAME'):
      name = i[5:-1]
    if i.startswith('PHONE'):
      phone = i[6:-1]
    if another and name and phone:
      print(name, phone, sep=',')
      another = False

头像
oneleaf
论坛管理员
帖子: 10237
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 107 次

Re: ★★格式化输出,欢迎各种脚本或者语言

#15

帖子 oneleaf » 2009-09-23 13:17

eexpress 写了:8楼的,没判断2个都有效而已。至少可执行输出。而且是NAME 和 PHONE。这到无所谓。
ptw: 为什么大家都不用ARGV $1 这些的哦。
有判断啊,使用正则表达式匹配,如果两个都同时匹配就输出。搞参数也容易,麻烦嘛反正临时用用。
回复

回到 “非常任务”