2017-02-06 2 views
0

Ich möchte zwei Spalten aus zwei verschiedenen Dateien mit awk verbinden. Diese Dateien aussehen (A, B, C, 0, 1, 2, usw. sind Spalten)Join zwei Spalten aus verschiedenen Dateien mit awk

file1:

A B C D E F 

FIL2:

0 1 2 3 4 5 

Und ich möchte in der Lage sein wählen Sie beliebige Spalten auf meinem ouput, etwas von der Form:

Ie, möchte ich die Ausgabe sein:

A C E 4 5 

Ich habe eine Million Antworten mit dem folgenden awk-Code (und sehr ähnlichen) gesehen, die keine Erklärung bieten. Aber keiner von ihnen adressiert das genaue Problem, das ich lösen will:

awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1 

awk ' 
    NR==FNR {A[$1,$3,$6] = $0; next} 
    ($1 SUBSEP $2 SUBSEP $3) in A {print A[$1,$2,$3], $4} 
' A.txt B.txt 

Aber keiner von ihnen scheint zu tun, was ich will, und ich bin nicht in der Lage, sie zu verstehen.

Also, wie kann ich mit awk die gewünschte Ausgabe erreichen? (Und bitte, eine Erklärung bieten, Ich möchte lernen, tatsächlich)

Hinweis: Ich weiß, ich kann wie

paste <(awk '{print $1}' file1) <(awk '{print $2}' file2) 

dies mit etwas tun, wie gesagt, ich versuche, awk zu lernen und verstehen .

+1

Ich verstehe nicht, was Sie von den zwei Dateien bekommen möchten .... können Sie gewünschte Ausgabe pls hinzufügen? – Kent

+0

Es ist da. Entschuldigung, wenn es nicht sehr klar war. Ich habe die Frage bearbeitet (die Ausgabe, die ich will, ist ACE 4 5, wo A, B, C ... 0, 1, 2 ... Spalte sind. – Scarlehoff

+1

von Join bedeuten Sie die Spalten nebeneinander Seite an Seite basierend auf Zeile einfügen Für den Beitritt benötigen Sie Schlüsselwerte, die in den Beispiel-Eingabedateien fehlen. – karakfa

Antwort

1

Mit GNU awk für echte multidimensionalen Arrays und ARGIND:

$ awk -v flds='1 1 1 3 1 5 2 5 2 6' ' 
    BEGIN{ nf = split(flds,o) } 
    { f[ARGIND][1]; split($0,f[ARGIND]) } 
    NR!=FNR { for (i=2; i<=nf; i+=2) printf "%s%s", f[o[i-1]][o[i]], (i<nf?OFS:ORS) } 
' file1 file2 
A C E 4 5 

Die „flds“ string ist nur eine Reihe von <file number> <field number in that file> Paare, so dass Sie die Felder aus jeder Datei in beliebiger Reihenfolge drucken können Sie mögen, zB:

$ awk -v flds='1 1 2 2 1 3 2 4 1 5 2 6' 'BEGIN{nf=split(flds,o)} {f[ARGIND][1]; split($0,f[ARGIND])} NR!=FNR{for (i=2; i<=nf; i+=2) printf "%s%s",f[o[i-1]][o[i]], (i<nf?OFS:ORS)}' file1 file2 
A 1 C 3 E 5 
$ awk -v flds='2 1 1 2 2 3 1 4 2 5' 'BEGIN{nf=split(flds,o)} {f[ARGIND][1]; split($0,f[ARGIND])} NR!=FNR{for (i=2; i<=nf; i+=2) printf "%s%s",f[o[i-1]][o[i]], (i<nf?OFS:ORS)}' file1 file2 
0 B 2 D 4 
Verwandte Themen