LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1051|回复: 5

求助:合并文件

[复制链接]
发表于 2008-5-7 23:53:55 | 显示全部楼层 |阅读模式
样本文件,目录下数个 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

谢谢,着急
发表于 2008-5-8 00:54:17 | 显示全部楼层
提供思路:

1、截取所有csv文件的日期并sort -u,这样得到所有csv文本的有效“日期”

2、以“日期”做循环,按顺序grep各个csv文件,用sed/awk处理获得去除“日期”剩余字串,合并字串输出。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-8 08:35:38 | 显示全部楼层
#!/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
回复 支持 反对

使用道具 举报

发表于 2008-5-8 09:33:05 | 显示全部楼层
这个我做过极类似的,从很多个数据文件里按某列 合并到另一个文件生成一个结果!
用awk、grep做得
不过数据文件很大,都是很多G的,太慢了,后来把数据导入到数据库里,用sql 语句按某条件直接查出结果,
回复 支持 反对

使用道具 举报

发表于 2008-5-8 10:54:10 | 显示全部楼层
try:

awk -F, '{b=$1","$2;sub(/[^,]*,/,"");sub(/[^,]*,/,"");a=a?a","$00}END{for(i in a) print i","a}' *.csv
回复 支持 反对

使用道具 举报

发表于 2008-5-8 14:54:46 | 显示全部楼层
用join 可以作,你注意到你写的这三个样本文件中,第一个文件前面不规范
a.csv------------------
1999-1-1 , 8:00, xxxx,cccc,bbbb
注意这里:1999-1-1 , 这里的逗号与前面的文字有个空格,而下面的文件中都没有,如果我们把这里改一下,保证所有文件这里都是统一的:
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

在这样的前提下,join才好用:
# join  a.csv b.csv | join - c.csv
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表