2016-06-19 15 views
-1

Ich habe einen Datensatz mit 1994 Datensätze mit 13 Feldern. Ich versuche, das Kreuzprodukt des Datensatz unten zu bekommen:Cross Produkt von Datensätzen in AWK mit Joins

Dataset

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 
1 2 5 6 7 3 1 8 5 9 7 3 4 
2 4 . . . . . . . . . . . 
3 9 . . . . . . . . . . . 
. . . . . . . . . . . . . 
. . . . . . . . . . . . . 
1994 . . . . . . . . . . . . 

Ausgang des Kreuzproduktes würde jeder Datensatz im Datensatz parallel sein (in kontinuierlicher Spalte) mit allen anderen Datensatz in der Datensatz wie unten dargestellt:

Erwartete Ausgabe

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 
. . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . 

Wenn ich den Code ausführen: join file{,} -j99 ich sowohl die Aufzeichnungen Kreuzprodukt eine unter anderen. Wenn ich den gleichen Code für Datensätze unter 10 anwenden, dann ist die Ausgabe wie erwartet. Ich habe versucht, den Wert von -j auf 99999 und 9999999 zu ändern, aber keine Änderung in der Ausgabe.

ich ausgegeben als:

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 
. . . . . . . . . . . . . 
. . . . . . . . . . . . . 

Also, ich 1994 Datensätze haben, sollte ich: 1994 * 1994 = 3.976.036, aber ich habe zweimal dieser Zeilen wie die Datensätze einer unter einem anderen sind.

+1

das gleiche sollte auch für 13 Felder funktionieren. Was ist dein Betriebssystem? – karakfa

+1

[bearbeiten] Sie Ihre Frage, um eine [mcve] anzuzeigen, die prägnante, testbare Beispieleingabe und erwartete Ausgabe enthält. –

+1

Ich denke, dass dein Problem auf Zeilenendungen zurückzuführen ist. Wenn Sie Ihre Datei aus der Windows-Umgebung kopiert haben, führen Sie 'dos2unix file' aus. – karakfa

Antwort

2

Eine Kreuzverbindung ist jede Zeile für jede Zeile. Also sagen Sie awk, um die ganze Datei neben jeder Zeile zu drucken. Etwas wie

#!/usr/bin/awk -f 
{ 
    cmd = "awk -v LINE='" $0 "' " "'{ printf(\"%s\\t%s\\n\", LINE, $0) }' " \ 
    FILENAME 
    system(cmd) 
} 

Aber ich würde das nie tun. Es ist ineffizient, awk O (N) Mal aufrufen, und es bringt Sie nicht viel. Ich würde die Datei in SQLite importieren und eine Kreuzverbindung verwenden, die mir eine where Klausel und benannte Spalten gab.

+0

tatsächlich, indem ich so versuche, den Abstand zwischen den beiden zu finden. Das heißt, nehmen Sie zuerst auf und vergleichen Sie mit jedem Datensatz und berechnen Sie den euklidischen Abstand und suchen Sie am Ende nach dem Datensatz, der dem Datensatz am nächsten ist, und prüfen Sie, ob die Felder $ 6 sind. Wenn sich beide Datensätze im selben Klassenfeld befinden, würde ich der Genauigkeit +1 hinzufügen. Ich versuche 1nn Genauigkeit mit AWK zu berechnen. aber es ist schwierig, den optimalen Weg zu finden. Kannst du diesen Link überprüfen und mich aufklären, wie es geht: http://stackoverflow.com/questions/37897154/one-nearest-neighbour-using-awk –