合并2个文件中的相同列号

时间:2012-11-07 19:44:12

标签: r awk

我有两个大文件。每个文件有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 

6 个答案:

答案 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)

以下是awkpaste

的快速而肮脏的实现
#!/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