2つのファイルを一度に1列ずつマージする


12

次の形式の2つの大きなファイル(3000列、15000行)があります

file1(タブ区切り):

1/0 0/0 0/0
0/0 1/1 0/0
1/1 0/1 0/0

file2(タブ区切り):

3 5 2
1 7 10
3 4 3

各ファイルの最初の列の値を「:」区切り文字で組み合わせてから、2番目、3番目などの列に移動します。必要な出力(タブ区切り):

1/0:3 0/0:5 0/0:2
0/0:1 1/1:7 0/0:10
1/1:3 0/1:4 0/0:3

効率は重要ではないため、どの言語でも問題ありません。これが以前に尋ねられた場合、私は謝罪します。

回答:


14

このようなもの?サンプルデータを使用した作業:

paste  file{1,2} | awk '{for (i=1;i<=NF/2; i++){printf "%s:%s\t",$i,$(NF/2+i)};printf "\n"}'
1/0:3   0/0:5   0/0:2
0/0:1   1/1:7   0/0:10
1/1:3   0/1:4   0/0:3

2
ペーストが大好きです。+1
グレンジャックマン16

@glennjackmanで十分です。回答を修正します。
ティンク

はい!完全に機能しました!迅速な返答に感謝致します。
ジョンデグナー

9
awk '{
    getline f2 < "file2"
    split(f2, a)
    for (i=1; i<=NF; i++) 
        printf "%s:%s\t", $i, a[i]
    print ""
}' file1

Tinkの応答のシンプルさを好みますが、完璧に機能しました。
ジョンデグナー

1
@JonDegnerは、その回答(またはこの回答)で問題が解決した場合、しばらくして左のチェックマークをクリックして受け入れてください。これにより、質問に回答済みのマークが付けられ、Stack Exchangeサイトで感謝が表明されます。
テルドン

6

少し異なるアプローチ:

paste -d: <(xargs -n1 <file1) <(xargs -n1 <file2) | xargs -n 3

私はこれを支持しましたが、-n 3部分は提供されたサンプルでのみ機能することに気付きました。列数は、実際のデータに合わせて変更する必要があります。
ティンク

@tink明らかに、はい。head -n1 | wc -wただし、列カウントはのようなもので計算できます。
マイケルVehrs 16

へえ。それはあなたが応答することを意味していませんでした、私はそれを回避する方法をよく知っています...あなたの答えは1つ少ない賛成票を持っているべきであるという説明だけです:}
tink
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.