1

我有两个大文件。每个文件有 1000 列和 2000 行。我想使用循环(R或linux)合并它们,以便相同的列号聚集在一起:

文件一:

[,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 
4

6 回答 6

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]
}
于 2012-11-07T19:50:49.870 回答
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
于 2012-11-07T19:56:24.293 回答
0

awk这是一个使用and的快速而肮脏的实现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
于 2012-11-07T19:55:57.560 回答
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;}'

于 2012-11-07T20:46:14.647 回答
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
于 2012-11-07T21:22:29.833 回答
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
于 2012-11-07T21:26:57.873 回答