w*****1 发帖数: 473 | 1 【 以下文字转载自 Unix 讨论区 】
发信人: wz99331 (dotti), 信区: Unix
标 题: 如何合并两个数据文件
发信站: BBS 未名空间站 (Mon Mar 24 15:53:39 2014, 美东)
我有两个数据文件,第一个有3000多行(每行代表一个人的家庭情况),第二个有
1800多行,每行代表一个人的其他情况。现在想把两个文件合并起来,第2个文件
里的人都包含在第1个文件里面。合并后的人数和第1个文件一样,有1200人的其
他情况没有数据,就视为缺省值。由于数据非常大,第一行也没有变量名,所以没法用
SAS和R。请问UNIX有没有可以这样合并的命令?谢谢! |
b*********n 发帖数: 2975 | 2 creat a name variable as key, then use first left join second on a.name = b.
name
【 以下文字转载自 Unix 讨论区 】
发信人: wz99331 (dotti), 信区: Unix
标 题: 如何合并两个数据文件
发信站: BBS 未名空间站 (Mon Mar 24 15:53:39 2014, 美东)
我有两个数据文件,第一个有3000多行(每行代表一个人的家庭情况),第二个有
1800多行,每行代表一个人的其他情况。现在想把两个文件合并起来,第2个文件
里的人都包含在第1个文件里面。合并后的人数和第1个文件一样,有1200人的其
他情况没有数据,就视为缺省值。由于数据非常大,第一行也没有变量名,所以没法用
SAS和R。请问UNIX有没有可以这样合并的命令?谢谢!
【在 w*****1 的大作中提到】 : 【 以下文字转载自 Unix 讨论区 】 : 发信人: wz99331 (dotti), 信区: Unix : 标 题: 如何合并两个数据文件 : 发信站: BBS 未名空间站 (Mon Mar 24 15:53:39 2014, 美东) : 我有两个数据文件,第一个有3000多行(每行代表一个人的家庭情况),第二个有 : 1800多行,每行代表一个人的其他情况。现在想把两个文件合并起来,第2个文件 : 里的人都包含在第1个文件里面。合并后的人数和第1个文件一样,有1200人的其 : 他情况没有数据,就视为缺省值。由于数据非常大,第一行也没有变量名,所以没法用 : SAS和R。请问UNIX有没有可以这样合并的命令?谢谢!
|
w*****1 发帖数: 473 | 3 1800多行的数据有非常非常多列,有几万列,是GWAS的GENOTYPE DATA.如何给每一
列加上变量名啊。 |
w*****1 发帖数: 473 | 4 你是说,只要给其中一列加上变量名,其他列不需要变量名也可以吗? |
M*Q 发帖数: 54 | 5 OP的文件估计是两个文本文件,csv之类的?load进database,然后按照
楼上的办法就可以了。另外,3000行的数据读入到Python, R里面应该也
没有问题的(不知道有多少column)。至于shell下面的工具,我就不知道了……
b.
【在 b*********n 的大作中提到】 : creat a name variable as key, then use first left join second on a.name = b. : name : : 【 以下文字转载自 Unix 讨论区 】 : 发信人: wz99331 (dotti), 信区: Unix : 标 题: 如何合并两个数据文件 : 发信站: BBS 未名空间站 (Mon Mar 24 15:53:39 2014, 美东) : 我有两个数据文件,第一个有3000多行(每行代表一个人的家庭情况),第二个有 : 1800多行,每行代表一个人的其他情况。现在想把两个文件合并起来,第2个文件 : 里的人都包含在第1个文件里面。合并后的人数和第1个文件一样,有1200人的其
|
g*****o 发帖数: 812 | 6 我表示我以前用excel+vba处理过六十几万行的lemma表...
【在 w*****1 的大作中提到】 : 【 以下文字转载自 Unix 讨论区 】 : 发信人: wz99331 (dotti), 信区: Unix : 标 题: 如何合并两个数据文件 : 发信站: BBS 未名空间站 (Mon Mar 24 15:53:39 2014, 美东) : 我有两个数据文件,第一个有3000多行(每行代表一个人的家庭情况),第二个有 : 1800多行,每行代表一个人的其他情况。现在想把两个文件合并起来,第2个文件 : 里的人都包含在第1个文件里面。合并后的人数和第1个文件一样,有1200人的其 : 他情况没有数据,就视为缺省值。由于数据非常大,第一行也没有变量名,所以没法用 : SAS和R。请问UNIX有没有可以这样合并的命令?谢谢!
|
w*****1 发帖数: 473 | 7 有几万列,太大了,尝试过用r一直读不完。是txt文件。
【在 M*Q 的大作中提到】 : OP的文件估计是两个文本文件,csv之类的?load进database,然后按照 : 楼上的办法就可以了。另外,3000行的数据读入到Python, R里面应该也 : 没有问题的(不知道有多少column)。至于shell下面的工具,我就不知道了…… : : b.
|
w*****1 发帖数: 473 | 8 我试过用excel打开,但是说列太多了,打开不完整。
【在 g*****o 的大作中提到】 : 我表示我以前用excel+vba处理过六十几万行的lemma表...
|
d****n 发帖数: 12461 | 9 有key就简单。每行当作(key,value), value就是那剩下几万列。
不过宽表join对于缺失数据空间浪费太大,遇到key不是1-1的更麻烦。
【在 w*****1 的大作中提到】 : 有几万列,太大了,尝试过用r一直读不完。是txt文件。
|
l*********o 发帖数: 3091 | |
|
|
m*********u 发帖数: 1491 | 11 首先要知道数据以何种format存在,
然后用bcp, bulk insert,import, SSIS把数据load到SQL Server
或者用sqlldr , bulk insert把数据Load 到oracle 数据库
根据需要看是否需要做数据清理。
之后就用 left table join 即可达成目的。 |
g*****o 发帖数: 812 | 12 可能你表格太稠密了..
【在 w*****1 的大作中提到】 : 我试过用excel打开,但是说列太多了,打开不完整。
|
g*******l 发帖数: 239 | 13 一行perl 搞定。。。
【在 w*****1 的大作中提到】 : 我试过用excel打开,但是说列太多了,打开不完整。
|
w*****1 发帖数: 473 | 14 我用了perl了,先用小点的数据文件可以合并起来,但是真正用大数据文件作为输入文
件的时候又不行了。你的一行perl能写出来给我看看吗?谢谢! |
w*****1 发帖数: 473 | 15 我想把这两个文件合并起来。gtriple.txt有3000多行,gws只有1800多行,我
希望合并以后和gtriple一样多行,而且他们的合并以两个文件的第一列(ID)为匹配,
合并好以后的缺省值(missing data)用0表示。我用这样的命令结果不对,出来的有
4000多列,大家能否帮我看看怎么回事?谢谢!
join -a1 -e "0" gtriple.txt gws.txt > gws.ped |
p****o 发帖数: 1340 | 16 join won't replace missing fields with zero in the second file. maybe you
can
insert these missing records with zeros in gws.txt, then gstriple and gws
will
match line by line.
not sure why you end up with more lines, you can check whether the
keys are unique in your second file...
【在 w*****1 的大作中提到】 : 我想把这两个文件合并起来。gtriple.txt有3000多行,gws只有1800多行,我 : 希望合并以后和gtriple一样多行,而且他们的合并以两个文件的第一列(ID)为匹配, : 合并好以后的缺省值(missing data)用0表示。我用这样的命令结果不对,出来的有 : 4000多列,大家能否帮我看看怎么回事?谢谢! : join -a1 -e "0" gtriple.txt gws.txt > gws.ped
|
i*e 发帖数: 352 | 17 GWAS的东西你应该看看PLINK和GTOOL先
再说有必要把genotype 和 sample/phenotype合并在一个单独文件吗
【在 w*****1 的大作中提到】 : 1800多行的数据有非常非常多列,有几万列,是GWAS的GENOTYPE DATA.如何给每一 : 列加上变量名啊。
|
w*****1 发帖数: 473 | 18 我需要用merlin来做gwas。不能用plink做,因为需要考虑家庭因素。plink家庭因素方
面做的不好。merlin要把genotype 和 sample/phenotype合并在一个单独文件 |
w*****1 发帖数: 473 | 19 gws.txt本身只有1834行,只有和gtriple合并了以后才出现missing fields.
这样就没法直接在gws文件里先加0啊。
【在 p****o 的大作中提到】 : join won't replace missing fields with zero in the second file. maybe you : can : insert these missing records with zeros in gws.txt, then gstriple and gws : will : match line by line. : not sure why you end up with more lines, you can check whether the : keys are unique in your second file...
|
d*******y 发帖数: 349 | 20 楼主你的unix命令应该对的。你两个文件都sort了么?而且应该是sort by ID column
only. 两个文件的key都是unique的么
?而且你的命令缺省了delimiter,所以两个文件的delimiter都是space么?join 命令
default的delimiter是space, 不是tab。
结果你说有4000多列,所以missing了几万列的data? |
|
|
i*e 发帖数: 352 | 21 嗯,那么你也不会想用SNPTEST了
你那个命令貌似没问题,事先有sort过对吧,而且你两个文件应该都是tab-delim的?
【在 w*****1 的大作中提到】 : 我需要用merlin来做gwas。不能用plink做,因为需要考虑家庭因素。plink家庭因素方 : 面做的不好。merlin要把genotype 和 sample/phenotype合并在一个单独文件
|
w*****1 发帖数: 473 | 22 两个文件都sort了, 两个文件的key都是unique.现在的问题就是合并后missing data不
能用0补上。下面的列子说了如何用0补上,但是我用了还是不成功
http://www.albany.edu/~ig4895/join.htm
可以用这个命令:
join -a1 -a2 -1 2 -2 2 -o 0 1.1 2.1 -e "0" 1.txt 2.txt
下面这两句话不知道是什么意思:
A "0" (that.s a zero) means display the join field
A number in the format of X.Y means to display the Y field from the X file (
ex 2.1 means display the first field from the second file). |
w*****1 发帖数: 473 | 23 一个是space delim, 另外一个不知道是什么delim的,没办法用excel 打开。当初用
cut的时候用了space.
【在 i*e 的大作中提到】 : 嗯,那么你也不会想用SNPTEST了 : 你那个命令貌似没问题,事先有sort过对吧,而且你两个文件应该都是tab-delim的?
|
d*******y 发帖数: 349 | 24 我想起来了。要用-e option必须和 -o option一起用。-o 是unix如何print output。
但是你有几万列的话,这个方法不适用。
0 是指 你的key
1.1 是file1的第一列
2.1 是file2的第一列。
你这个几万列的数据必须用迂回的办法。 |
w*****1 发帖数: 473 | 25 怎么迂回啊?在线等
。
【在 d*******y 的大作中提到】 : 我想起来了。要用-e option必须和 -o option一起用。-o 是unix如何print output。 : 但是你有几万列的话,这个方法不适用。 : 0 是指 你的key : 1.1 是file1的第一列 : 2.1 是file2的第一列。 : 你这个几万列的数据必须用迂回的办法。
|
d*******y 发帖数: 349 | 26 这是我做的test。
test1
1|2|3
2|3|4
3|2|5
test2
1|a|f
2|b|g
join test1 and test2 using regular left outer join.
join -t"|" -a1 test1 test2 > test3
now, process test3
awk -F"|" 'BEGIN{for(i=1;i<=2;i++) testvar=testvar"|0"}NF<5 {print $0testvar;
next}{print $0}' test3 > test4
注意事项:
1.我的例子用的是pipe做为delimiter,习惯.
2.希望for loop要多长看你的两个文件column 差多少。
试试吧。不过几万列,不知道你的awk版本给不给力。如果不行试试gawk。 |
w*****1 发帖数: 473 | 27 如果我还是用space delimiter,就是要改成:
join -t" " -a1 test1 test2 > test3
awk -F" " 'BEGIN{for(i=1;i<=2;i++) testvar=testvar"|0"}NF<5 {print $
0testvar;
next}{print $0}' test3 > test4
是吗?谢谢! |
i*e 发帖数: 352 | 28 i<=2和NF<5要相应改一下
【在 w*****1 的大作中提到】 : 如果我还是用space delimiter,就是要改成: : join -t" " -a1 test1 test2 > test3 : awk -F" " 'BEGIN{for(i=1;i<=2;i++) testvar=testvar"|0"}NF<5 {print $ : 0testvar; : next}{print $0}' test3 > test4 : 是吗?谢谢!
|
w*****1 发帖数: 473 | 29 testvar=testvar"|0"}
如果是用space delimiter的话,0前面的|是不是要去掉 |
w*****1 发帖数: 473 | |
|
|
i*e 发帖数: 352 | 31 是的 testvar=testvar" 0"
【在 w*****1 的大作中提到】 : NF<5 是什么意思
|
i*e 发帖数: 352 | 32 awk中NF意思是记录的域的个数,换句话说就是你用分隔符划分后的column的个数
test1和test2合并之后的test3有5列
NF<5指的就是那些需要补充后续0的行
i<=2是说循环2次,因为test1有3列,test3有5列,相差2列
【在 w*****1 的大作中提到】 : NF<5 是什么意思
|
w*****1 发帖数: 473 | 33 2.希望for loop要多长看你的两个文件column 差多少。
这个的意思是第一个文件和合并以后的文件column差多少,for loop就是多长对吧。 |
w*****1 发帖数: 473 | 34 我用了这个命令,结果所有加上去的0都和第一个文件的最后一列粘在一起,看了一下
列数,产生后的gpt4.txt需要补0的行还是只有5列。
awk 'BEGIN{for(i=1;i<=1636908;i++) testvar=testvar"0"}NF<1636913 {print $
0testvar;next}{print $0}' gpt2.txt > gpt4.txt |
i*e 发帖数: 352 | 35 如果你分隔符是空格,testvar=testvar"0" 0前面要加一个空格
【在 w*****1 的大作中提到】 : 我用了这个命令,结果所有加上去的0都和第一个文件的最后一列粘在一起,看了一下 : 列数,产生后的gpt4.txt需要补0的行还是只有5列。 : awk 'BEGIN{for(i=1;i<=1636908;i++) testvar=testvar"0"}NF<1636913 {print $ : 0testvar;next}{print $0}' gpt2.txt > gpt4.txt
|
w*****1 发帖数: 473 | |
o******n 发帖数: 511 | 37 看到你已经解决了,还是想问下:没有变量名,为啥不能用R做?导进去,我记得如果
它们里面有内容相同,R可以match两个文本的,好像the art of r programming里就有
类似的例子。 |
g*******l 发帖数: 239 | |
g*******l 发帖数: 239 | 39 带结构的脚本如下
perl -we '
$m=0;
open(A,"$ARGV[0]");
while(){
s/\s+$//;
@t=split(/\s+/);
$m=scalar(@t);
$h{$t[0]}=$_;
}
close(A);
$n=0;
open(B,"$ARGV[1]");
while(){
s/\s+$//;
@t=split(/\s+/);
$n=scalar(@t);
$h{$t[0]}.="\t".join("\t",@t[1..$n-1])if(exists$h{$t[0]});
}
close(B);
foreach(keys%h){
@t=split(/\s+/,$h{$_});
if(scalar(@t)==$m){
print $h{$_},"\t0"x$n,"\n";
}else{
print"$h{$_}\n";
}
}
' gtriple.txt gws.txt > gws.ped
//
exists$
m)
gws
【在 g*******l 的大作中提到】 : 请大家指教 : perl -we '$m=0;open(A,"$ARGV[0]");while(){s/\s+$//;@t=split(/\s+/);$m= : scalar(@t);$h{$t[0]}=$_;}close(A);$n=0;open(B,"$ARGV[1]");while(){s/\s+$// : ;@t=split(/\s+/);$n=scalar(@t);$h{$t[0]}.="\t".join("\t",@t[1..$n-1])if( : exists$ : h{$t[0]});}close(B);foreach(keys%h){@t=split(/\s+/,$h{$_});if(scalar(@t)==$m) : {print $h{$_},"\t0"x$n,"\n";}else{print"$h{$_}\n";}}' gtriple.txt gws.txt > : gws : .ped
|
w*****1 发帖数: 473 | 40 R 是可以做的,但是有个数据文件有5个G,读很久都读不进去。
【在 o******n 的大作中提到】 : 看到你已经解决了,还是想问下:没有变量名,为啥不能用R做?导进去,我记得如果 : 它们里面有内容相同,R可以match两个文本的,好像the art of r programming里就有 : 类似的例子。
|
|
|
h****d 发帖数: 485 | 41 编写一个C语言程序吧
【在 w*****1 的大作中提到】 : 有几万列,太大了,尝试过用r一直读不完。是txt文件。
|
O*O 发帖数: 2284 | 42 硬件不行吧,那就不要把整个文件读进内存。可以用R,Python分段读取。
俺现在主要用R,几十GB的文件很常见,没啥问题。
[发表自未名空间手机版 - m.mitbbs.com]
【在 w*****1 的大作中提到】 : R 是可以做的,但是有个数据文件有5个G,读很久都读不进去。
|
l*******s 发帖数: 1258 | 43 用个什么java或者python啥的,每一行创建一个hash,然后就是两个List
String,String>>()合并 |
a***e 发帖数: 1010 | 44 用 perl 很简单的
建一个 %flag
建一个 %temp
(1) 先打开file2, 按行读入,用第一列做标记, 赋值为 1 ($flag{$1} =1), 并且把整
行赋值到 $temp{$1} = $line
(2) 再打开file1, 按行读入,先检验第一列的标记是否为 1 ($flag{$1} ==1),
如果不是,把file1的 行写到新文件file3;
如果标记是 1, 把file1的 行写到新文件file3, 把$temp{$1}夜写到这一行里 。
【在 w*****1 的大作中提到】 : R 是可以做的,但是有个数据文件有5个G,读很久都读不进去。
|