Scalanie dwóch plików, jedna kolumna na raz

12

Mam 2 duże pliki (3000 kolumn, 15000 wierszy) o następującym formacie

plik1 (rozdzielany tabulatorami):

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

plik2 (rozdzielony tabulatorami):

3 5 2
1 7 10
3 4 3

Chciałbym połączyć wartości z pierwszej kolumny każdego pliku z separatorem „:”, a następnie przejść do drugiej, trzeciej itd. Kolumny. Żądane wyjście (rozdzielone tabulatorami):

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

Wydajność nie jest krytyczna, więc każdy język jest w porządku. Przepraszam, jeśli wcześniej o to pytano.

Jon Degner
źródło

Odpowiedzi:

14

Coś takiego? Pracowałem z przykładowymi danymi:

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
zadzwonić
źródło
2
Kocham wklej. +1
glenn jackman
Wystarczająco uczciwy @glennjackman; Zmienię moją odpowiedź.
Tink
Tak! Działa idealnie! Dziękuję za szybką odpowiedź.
Jon Degner,
9
awk '{
    getline f2 < "file2"
    split(f2, a)
    for (i=1; i<=NF; i++) 
        printf "%s:%s\t", $i, a[i]
    print ""
}' file1
Glenn Jackman
źródło
Działa idealnie, chociaż wolę prostotę reakcji dzwonka.
Jon Degner,
1
@JonDegner, jeśli ta odpowiedź (lub ta) rozwiązała problem, poświęć chwilę i zaakceptuj ją , klikając znacznik wyboru po lewej stronie. To oznacza pytanie jako odpowiedź i jest to sposób wyrażania podziękowań na stronach Stack Exchange.
terdon
6

Nieco inne podejście:

paste -d: <(xargs -n1 <file1) <(xargs -n1 <file2) | xargs -n 3
Michael Vehrs
źródło
Poparłem to, ale zdałem sobie sprawę, że część -n 3 działa tylko na podanej próbce. Należy zmodyfikować liczbę kolumn, aby uwzględnić rzeczywiste dane.
zadzwonić
@ tink Oczywiście, że tak. Można jednak obliczyć liczbę kolumn za pomocą czegoś takiego head -n1 | wc -w.
Michael Vehrs,
Heh To nie było przeznaczone do odpowiedzi, jestem w pełni świadomy tego, jak to obejść ... po prostu wyjaśnienie, że twoja odpowiedź powinna mieć o jeden głos mniej pozytywny:}
zadzwoń