3

ファイル1の各列をファイル2の4番目の列として追加し、ファイル1の列番号または出力名に類似したものを使用して新しいファイルとしてエクスポートしたいと思います。

入力ファイル1と2の行数は同じです。

入力ファイル1にはN列があります。

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

入力ファイル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、貼り付けなど)

任意の提案をいただければ幸いです。

4

3 に答える 3

3

cut列がタブで区切られている場合は、次のメリットを簡単に得ることができますpaste

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
于 2012-11-05T21:48:46.053 に答える
1

このメソッドは、各ファイルを1回だけ処理します。これは、ファイルが大きい場合に役立ちます。ただし、最初のファイルをメモリに保存する必要があります。

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
于 2012-11-06T03:01:58.643 に答える
1

このようなものが必要なすべてです:

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
于 2012-11-06T13:44:44.747 に答える