看看这个怎么弄,合并文件

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15

看看这个怎么弄,合并文件

#1

帖子 iblicf » 2008-05-08 8:45

样本文件,目录下数个 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
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#2

帖子 RegentW » 2008-05-08 9:57

写个perl脚本,匹配功能很强大的
Core i5, 512G + SSD 20G, DDRIII 8G
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15

#3

帖子 iblicf » 2008-05-08 10:08

#!/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
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#4

帖子 eexpress » 2008-05-08 10:08

完全相同的?带时间也相同的?
cat到一个文件。sort
取得一个参数。“1999-1-1 , 8:00”,记录一个bool变量。下行,grep这个,为真,就吧'1999-1-1 , 8:00',替换成\n
为假,就循环取得行首的时间。loop

处理完了,tr '\n\' '●'。后期处理,2个●的,删除。一个的,变\n
● 鸣学
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#5

帖子 laborer » 2008-05-08 12:48

如果后面的数据中没有空格,可以用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
thword
帖子: 119
注册时间: 2007-04-09 12:19

#6

帖子 thword » 2008-05-08 16:29

代码: 全选

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]}'
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#7

帖子 eexpress » 2008-05-08 18:42

拉,都用awk了啊。都不sort下。何必搞数组
其实,我估计阿童木的这要求,没通用性的,可能那后面的数据都没规则。 :lol:
● 鸣学
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15

#8

帖子 iblicf » 2008-05-13 13:34

文件的规范性的确有问题, 时间格式都不统一,,还有我本想装配好一个文件统一 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) 指教一二吧,呵呵,

着急呢,生产环境,以前的设计有问题,现在想不大动程序,修改修改实现
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#9

帖子 eexpress » 2008-05-13 13:55

不熟悉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
● 鸣学
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#10

帖子 laborer » 2008-05-13 22:28

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
回复