如何将file1的每一列附加到file2的特定字段并创build一个新的输出文件?

我想追加文件1的每一列作为文件2的第四列,并且导出为具有文件1的列号或类似输出名称的新文件。

input文件1和2具有相同的行数:

input文件1有N列:

12 23 34 ..... 33 34 23 67 09 34 45 67 34 65 76 44 64 33 96 

input文件2最初有5列

 AA BB FF DD 6 AA CC HH NN 7 AA DD II RR 4 AA EE JJ PP 2 AA FF KK QQ 9 AA GG LL SS 8 

例如,前3个输出文件将如下所示:

输出文件1(第1列):

 AA BB FF 12 DD 6 AA CC HH 33 NN 7 AA DD II 67 RR 4 AA EE JJ 45 PP 2 AA FF KK 65 QQ 9 AA GG LL 64 SS 8 

输出文件2(第2列):

 AA BB FF 23 DD 6 AA CC HH 34 NN 7 AA DD II 09 RR 4 AA EE JJ 67 PP 2 AA FF KK 76 QQ 9 AA GG LL 33 SS 8 

输出文件3(第3列):

 AA BB FF 34 DD 6 AA CC HH 23 NN 7 AA DD II 34 RR 4 AA EE JJ 34 PP 2 AA FF KK 44 QQ 9 AA GG LL 96 SS 8 

新的文件名可以是file1,file2,file3 …或column1,column2,column3 ….或类似的东西。 我怎样才能做到这一点? (for循环awk,粘贴等)

任何build议,将不胜感激。

如果您的列是制表符分隔的,您可以轻松从cutpaste获益:

 for i in {1..N} ; do # Insert the real N here, or change to $(seq 1 $N) cut -f1-3 input2 | \ paste - \ <(cut -f$i input1) \ <(cut -f4- input2) \ > output$i done 

这种方法只处理每个文件一次,这是一个帮助,如果文件很大。 但是,它确实需要将第一个文件存储在内存中:

 awk ' NR==1 {n=NF} NR==FNR { for (i=1; i<=n; i++) file1[i, FNR]=$i next } { for (i=1; i<=n; i++) { filename = "merged" i print $1, $2, $3, file1[i, FNR], $4, $5 >> filename } } ' file1 file2 

像这样的东西就是你所需要的:

 awk ' NR==FNR { hd=$1" "$2" "$3"; tl=$4" "$5; next } { for (i=1;i<=NF;i++) { print hd, $i, tl > "file" i } } ' file2 file1