当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 10 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 看看这个怎么弄,合并文件
帖子发表于 : 2008-05-08 8:45 
头像

注册: 2007-01-15 17:15
帖子: 3766
送出感谢: 0 次
接收感谢: 0 次
样本文件,目录下数个 csv ,
a.csv------------------
1999-1-1 , 8:00, xxxx,cccc,bbbb


b.csv-----------------------------
1999-1-1, 8:00, asdfa,adsf,fdsfd, sdfadsf,gadfdf
2000-1-1, 9:00, hehe,haha,dfdf,dddd,gggg

c.csv-----------------------------
1999-1-1, 8:00, tttt,yyyy,uuuu,iiii
2009-1-1, 8:00, ffff,dddd,ssss,aaaa

要求把相同的 日期时间的连成一行到一个文件,

类似:
1999-1-1,8:00,xxxx,cccc,bbbb,asdfa,adsf,fdsfd, sdfadsf,gadfdf,tttt,yyyy,uuuu,iiii


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-05-08 9:57 
头像

注册: 2007-02-27 21:47
帖子: 1473
地址: GL
送出感谢: 0 次
接收感谢: 0 次
写个perl脚本,匹配功能很强大的


_________________
Intel Pentium Dual Core 2.1G, 250G, DDRII 3G, ATI Radeon HD 4330
LMDE


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-05-08 10:08 
头像

注册: 2007-01-15 17:15
帖子: 3766
送出感谢: 0 次
接收感谢: 0 次
#!/bin/bash

cat a1 b1 |awk -F"," '{print $1,$2}'|sort|uniq|sed 's/ /,/g' >c1
while read line
do
num1=`grep "$line" a1|awk -F"," '{print $3,$4,$5,$6}'|sed 's/ /,/g'`
[ -z "$num1" ] && num1=0
num2=`grep "$line" b1|awk -F"," '{print $3,$4,$5,$6}'|sed 's/ /,/g'`
[ -z "$num2" ] && num2=0
echo "$line,$num1,$num2"
done <c1


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-05-08 10:08 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
完全相同的?带时间也相同的?
cat到一个文件。sort
取得一个参数。“1999-1-1 , 8:00”,记录一个bool变量。下行,grep这个,为真,就吧'1999-1-1 , 8:00',替换成\n
为假,就循环取得行首的时间。loop

处理完了,tr '\n\' '●'。后期处理,2个●的,删除。一个的,变\n


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-05-08 12:48 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
如果后面的数据中没有空格,可以用awk
代码:
$ cat *csv
1999-1-1, 8:00, xxxx,cccc,bbbb
1999-1-1, 8:00, asdfa,adsf,fdsfd,sdfadsf,gadfdf
2000-1-1, 9:00, hehe,haha,dfdf,dddd,gggg
1999-1-1, 8:00, tttt,yyyy,uuuu,iiii
2009-1-1, 8:00, ffff,dddd,ssss,aaaa
$ cat *csv | awk '{ if (A[$1" "$2]) A[$1" "$2]=A[$1" "$2]","$3; else A[$1" "$2]=$3 } END { for (a in A) print a" "A[a] }'
1999-1-1, 8:00, xxxx,cccc,bbbb,asdfa,adsf,fdsfd,sdfadsf,gadfdf,tttt,yyyy,uuuu,iiii
2009-1-1, 8:00, ffff,dddd,ssss,aaaa
2000-1-1, 9:00, hehe,haha,dfdf,dddd,gggg

之后可以根据需要排个序什么的


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-05-08 16:29 

注册: 2007-04-09 12:19
帖子: 119
送出感谢: 0 次
接收感谢: 0 次
代码:
cat *.csv | sed 's/ //g' | awk -F , '{a[$1","$2]=a[$1","$2]","substr(substr($0, index($0, ",")+1), index(substr($0, index($0, ",")+1), ",")+1)}END{for(x in a)print x a[x]}'


如果awk可以方便地指定输出第N个之后的字段,或者它的index函数能够指定返回第N次匹配就不至于写成这样了。

用perl或者python应该能够简单点吧。

-------------------------------------------------------
LS的laborer兄的更简单点

根据laborer兄的方法

代码:
cat *.csv | sed 's/ //g' | sed 's/,/, /2' | awk '{if(A[$1])A[$1]=A[$1]","$2;else A[$1]=$2}END{for(a in A)print a A[a]}'


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-05-08 18:42 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
拉,都用awk了啊。都不sort下。何必搞数组
其实,我估计阿童木的这要求,没通用性的,可能那后面的数据都没规则。 :lol:


_________________
● 鸣学


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-05-13 13:34 
头像

注册: 2007-01-15 17:15
帖子: 3766
送出感谢: 0 次
接收感谢: 0 次
文件的规范性的确有问题, 时间格式都不统一,,还有我本想装配好一个文件统一 dbldr 到 oracle 里边去,那字段排序也有问题,nnd

Q1 : 怎么控制读 csv 文件的顺序?根据文件名 ,比如我要按 b.csv c.csv a.csv 顺序处理,

Q2: 怎么把 4/17/08 (月/日/年) 这样的字段统一成 2008-04-17 ,

Q3: 如果我用循环读记录的方式,在shell 里边插 数据库表,,类似循环调用
代码:
su - oracle -c "sqlplus username/password"<<EOF
INSERT table values ( .... ) ;
exit


明显效率低,我觉得应该是 shell 开启一个事务,统一插记录玩了,关闭数据库,(只登陆一次),不知道是否可行。。

有熟悉 shell 操作 oracle 的哥们加我 msn (weiyh@tom.com) 指教一二吧,呵呵,

着急呢,生产环境,以前的设计有问题,现在想不大动程序,修改修改实现


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-05-13 13:55 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
不熟悉oracle
b.csv c.csv a.csv 顺序,可以shell里面用while read i; do xxxx; done<`cat b.csv c.csv a.csv`
日期,可以用date带上strftime格式转换
调用oracle,可以
xxx <<EOF
INSxxx
xxx
EOF


_________________
● 鸣学


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-05-13 22:28 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
iblicf 写道:
Q3: 如果我用循环读记录的方式,在shell 里边插 数据库表

先把所需要的SQL指令都生成出来,再去调用数据库,或者用下面的形式
代码:
for ....; do
    echo "INSERT ...."
done | oracle ....


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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