我有两个大文件。每个文件有1000列和2000行。我想使用循环(R或linux)合并它们,以便相同的列号组合在一起:
提交a:
[,1] [,2] ... [,1000]
1 3
1 3
1 4
1 3
1 5
文件b:
[,1] [,2] .... [,1000]
2 7
2 8
2 9
2 10
2 11
合并后:
[,1] [,1] [,2][,2] .... [,1000][,1000]
1 2 3 7
1 2 3 8
1 2 4 9
1 2 3 10
1 2 5 11
答案 0 :(得分:1)
好的,这是在Gavin的帮助下使用循环的另一种方法
result<-matrix(0,nrow=5,ncol=2000)
t<-0
for (i in 1:(1000)){
t<-t+1
result[,(2*t-1)]<-a[,t]
result[,(2*t)]<-b[,t]
}
答案 1 :(得分:1)
一般解决方案是cbind()
。考虑:
a <- matrix(c(rep(1, 5),
3,3,4,3,5), ncol = 2)
b <- matrix(c(rep(2, 5),
7:11), ncol = 2)
cbind(a, b)
由此给出。
> cbind(a, b)
[,1] [,2] [,3] [,4]
[1,] 1 3 2 7
[2,] 1 3 2 8
[3,] 1 4 2 9
[4,] 1 3 2 10
[5,] 1 5 2 11
您显示的对象/看起来像矩阵,但您可以使用数据框执行相同的操作。
在您想要交错列的特殊情况下,子集可能很有用,根据您的示例
ind <- c(rbind(seq_len(ncol(a)), seq_len(ncol(b)) + ncol(a)))
cbind(a, b)[, ind]
> ind <- c(rbind(seq_len(ncol(a)), seq_len(ncol(b)) + ncol(a)))
> cbind(a, b)[, ind]
[,1] [,2] [,3] [,4]
[1,] 1 2 3 7
[2,] 1 2 3 8
[3,] 1 2 4 9
[4,] 1 2 3 10
[5,] 1 2 5 11
答案 2 :(得分:0)
以下是awk
和paste
#!/bin/bash
infile_a=a
infile_b=b
output_file=outfile
temp_a=tempa
temp_b=tempb
temp_out=tempout
if [[ -e $output_file ]]; then
rm $output_file
fi
touch $output_file
total_col=1000
cur_col=1
while [[ $cur_col -le $total_col ]]
do
awk -v col=$cur_col '{print $(col)}' $infile_a > $temp_a
awk -v col=$cur_col '{print $(col)}' $infile_b > $temp_b
paste $output_file $temp_a $temp_b > $temp_out
mv $temp_out $output_file
cur_col=$((cur_col+1))
done
答案 3 :(得分:0)
使用paste和awk的另一个快速而又脏的选择:
paste a b|awk 'BEGIN{cols=1000;} {line = ""; for(i=1; i<=cols; ++i) {line = line $i FS $(i + cols) FS;} print line;}'
答案 4 :(得分:0)
awk '
{
getline line < "fileb"
split(line, ary)
for (i=1; i<=NF; i++) {
printf("%s%s%s%s", $i, OFS, ary[i], OFS)
}
print ""
}
' filea
答案 5 :(得分:0)
在awk中非常简单,无需指定限制或创建临时文件或....:
$ awk 'NR==FNR{a[NR]=$0;next} {split(a[FNR],b); for (i in b) $i=b[i]" "$i}1' file1 file2
[,1] [,1] [,2] [,2] ... .... [,1000] [,1000]
1 2 3 7
1 2 3 8
1 2 4 9
1 2 3 10
1 2 5 11