看看这个怎么弄,合并文件
- iblicf
- 帖子: 3766
- 注册时间: 2007-01-15 17:15
看看这个怎么弄,合并文件
样本文件,目录下数个 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
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
- RegentW
- 帖子: 1486
- 注册时间: 2007-02-27 21:47
- 来自: NN
- iblicf
- 帖子: 3766
- 注册时间: 2007-01-15 17:15
#!/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
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
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- laborer
- 帖子: 1016
- 注册时间: 2005-10-25 11:15
- 联系:
如果后面的数据中没有空格,可以用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
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
-
- 帖子: 119
- 注册时间: 2007-04-09 12:19
代码: 全选
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]}'
用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]}'
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- iblicf
- 帖子: 3766
- 注册时间: 2007-01-15 17:15
文件的规范性的确有问题, 时间格式都不统一,,还有我本想装配好一个文件统一 dbldr 到 oracle 里边去,那字段排序也有问题,nnd
Q1 : 怎么控制读 csv 文件的顺序?根据文件名 ,比如我要按 b.csv c.csv a.csv 顺序处理,
Q2: 怎么把 4/17/08 (月/日/年) 这样的字段统一成 2008-04-17 ,
Q3: 如果我用循环读记录的方式,在shell 里边插 数据库表,,类似循环调用
明显效率低,我觉得应该是 shell 开启一个事务,统一插记录玩了,关闭数据库,(只登陆一次),不知道是否可行。。
有熟悉 shell 操作 oracle 的哥们加我 msn (weiyh@tom.com) 指教一二吧,呵呵,
着急呢,生产环境,以前的设计有问题,现在想不大动程序,修改修改实现
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 操作 oracle 的哥们加我 msn (weiyh@tom.com) 指教一二吧,呵呵,
着急呢,生产环境,以前的设计有问题,现在想不大动程序,修改修改实现
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- laborer
- 帖子: 1016
- 注册时间: 2005-10-25 11:15
- 联系:
先把所需要的SQL指令都生成出来,再去调用数据库,或者用下面的形式iblicf 写了:Q3: 如果我用循环读记录的方式,在shell 里边插 数据库表
代码: 全选
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
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