Betrachten Sie folgende Dateien:
file1
::
boo,8,1024
foo,7,2048
file2
::
foo,0,24,154
noo,0,10,561
file3
::
24,154,7,1024,0
Was ich brauche, ist zu Datei1 zu gehen und zu überprüfen, ob $2==7
; wenn sie wahr sind , nehmen $1
, $2
und $3
von File1 ; jetzt muss ich vergleichen, ob $1
von Datei1 gleich $1
von Datei2 ist ; wenn das stimmt, muss ich nehmen $3
und $4
von File2 , die existieren nicht in File1 , dann muss ich gehen File3 und prüfen , ob $1
von File3 gleich $3
von File2 und $2
von File3 ist gleich $4
von File2 ; Wenn ja, muss ich überprüfen, ob $2
aus Datei1ist gleich $3
von File3 , dann, wenn diese Bedingung wahr ist, muss ich $3
von File1 mit $4
von File3 vergleichen , wenn $3
von File1 mehr ist als $4
von File3 .
Ich habe folgendes Skript ausprobiert:
cat [file1] [file2] [file3] |
awk -F,
'{if(NF==3)
{if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
}else
{if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
}else
{if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
}
}
}'
Die gewünschte Ausgabe ist:
foo,7,2048,24,154,1024
quelle
TXR-Lösung:
Lauf:
Der scharfsinnige Beobachter wird jedoch feststellen, dass die 7 nirgendwo im Code angegeben wurde und nur in der Ausgabe erscheint! Dies liegt daran, dass der Code tatsächlich durch alle Datensätze in marschiert
file1
und alle Kombinationen druckt, die den Übereinstimmungen und Einschränkungen entsprechen . Der einzige in den Beispieldaten ist der mit demval0
Sein7
.Wenn mehr Kombinationen gefunden würden, könnte dies auf die folgende beschränkt werden
7
:Die TXR-Musterextraktionssprache bietet hier eine große Musterübereinstimmung mit impliziten Rückverweisen durch Wiederholung von Variablennamen, die mehrere Dateien umfassen, mit mehrzeiligen Extraktionsmustern und nicht-textuellen Einschränkungen sowie eingebetteten Nebenwirkungen wie Ausgabe usw. .
Akzeptierte Awk-Lösung übersetzte das TXR Lisp-
awk
Makro sorgfältig :Lauf:
Der
,1024
erforderliche Teil in der Ausgabe fehlt. Das Original "Awk Classic" hat dieses Verhalten.quelle