2 Stimmen

Übereinstimmende Einträge aus mehreren Eingabedateien

Mein FileA Inhalt ist:

 LetterA     LetterM  12
 LetterB     LetterC  45
 LetterB     LetterG  23

FileB Inhalt ist:

 LetterA    23   43    LetterZ
 LetterB    21   71    LetterC

Ich möchte den originalen Eintrag von FileA plus den Eintrag $2-$3 von FileB schreiben, wenn
FileA $1 = FileB $1 && FileA $2 = FileB $4.
Für die Ausgabe wie folgt:

 LetterB     LetterC  45   -50

Ich kann dies mit einer bash-Schleife tun

 while read ENTRY
 do
    COLUMN1=$(cut -f 1 $ENTRY)
    COLUMN2=$(cut -f 2 $ENTRY)
    awk -v COLUMN1="$COLUMN1" -v COLUMN2="COLUMN2" -v ENTRY="$ENTRY"   
         '($1==COLUMN1 && $4==COLUMN2) 
         {print ENTRY,$2-$3}' FileB
 done < FileA 

Diese Schleife ist jedoch zu langsam. Gibt es eine Möglichkeit, dies mit awk ohne Schleife zu tun?
Um mehrere Eingabedateien zu nehmen -> ihren Inhalt abzugleichen -> gewünschte Ausgabe zu drucken.

3voto

anubhava Punkte 713155

Es kann in einem awk-Einzelformat gelöst werden:

awk 'NR==FNR{a[$1":"$2]=$0; next}
     NR>FNR && $1":"$4 in a{print a[$1":"$4], $2-$3}' DateiA DateiB

ODER noch knapper (mit Dank an @JS):

awk 'NR==FNR{a[$1$2]=$0;next}$1$4 in a{print a[$1$4],$2-$3}' Datei{A,B}

1voto

John Zwinck Punkte 221200

Ich habe beschlossen, es mit Python und Numpy zu versuchen, um eine etwas unkonventionelle, aber hoffentlich schnelle Lösung zu finden:

import numpy as np

# Laden der Dateien in Arrays mit automatisch bestimmten Typen pro Spalte
a = np.genfromtxt("fileA", dtype=None)
b = np.genfromtxt("fileB", dtype=None)

# Verketten der Zeichenfolgenspalten (n.b. nimmt an, dass es keine "foo" "bar" und "fo" "obar" gibt)
aText = np.core.defchararray.add(a['f0'], a['f1'])
bText = np.core.defchararray.add(b['f0'], b['f3'])

# Finde die Positionen, an denen die Zeichenfolgen aus A in B übereinstimmen, und gebe die Werte aus
for index in np.where(np.in1d(aText, bText)):
    aRow = a[index][0]
    bRow = b[bText == aText[index]][0]
    print '{1} {2} {3} {0}'.format(bRow[1] - bRow[2], *aRow)

Bearbeitung: Sobald es läuft, ist es schnell, aber die Zeit, die für das Laden der Dateien aufgewendet wird, ist leider länger als die hervorragende Lösung von @anubhava mit awk.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X