Wählen Sie Daten basierend auf dem Wert eines Felds aus

282
Gigiux

Ich habe eine Datei mit mehreren Einträgen, die IDs enthalten, und eine andere Datei, bei der andere Einträge in verschiedene Felder unterteilt sind, die von einer TAB getrennt sind. Ich muss die Datensätze der zweiten Datei basierend auf dem übereinstimmenden Wert der ersten Datei auswählen. Ich habe im Web gesehen, dass AWK das richtige Werkzeug ist (obwohl wahrscheinlich GREP einfacher ist), aber ich bekomme keine Ausgabe.

Für dieses Beispiel habe ich Arrays Rater als Files verwendet, aber um awk verwenden zu können, musste ich eine temporäre Datei erstellen. Im Wesentlichen muss ich das dritte Feld der zweiten Datei (var2) mit dem von der ersten Datei (var1) bereitgestellten Wert abgleichen. Das Auswahlformular var2 sollte lauten: "shameText \ t someWhat \ t beta \ t thatIs", von dem ich nur das erste Feld drucke, daher sollte die Ausgabe einfach "shameText" sein. Ich habe vielleicht den richtigen Weg zum Zuweisen von Arrays verpasst, aber trotzdem ist dieses Beispiel nur ein Proxy für die tatsächliche Übereinstimmung von Dateien.

Die Frage ist: Wie wählt man eine Zeile (Datensatz) oder ein einzelnes Feld basierend auf einer Übereinstimmung zwischen einem Feld und dem Wert einer Variablen aus?

Beispiel:

var1="alpha beta gamma delta epsilon" var2=" 'someText somethingElse zeta someMore' 'sameText someElse kappa andMore' 'shameText someWhat beta thatIs' 'shortText moreElse theta andMore'" echo $var2 > tempFile for i in $var1 do printf "i is: %s\n" $i awk -F\t '$3 == "$i" ' tempFile echo "next item" done rm tempFile 
0
Wenn ich es richtig verstanden habe, möchten Sie Zeilen in `var2` suchen, deren drittes Feld eines der Wörter in der Liste 'var1' ist. Dann drucken Sie nur das erste Feld dieser Zeilen aus. 'Grep -f <(tr' '' \ n ' Paulo vor 6 Jahren 0
(Ich hätte diesen Kommentar schon einmal posten sollen) Ihr Code funktioniert, aber es gibt einige Korrekturen. In `echo $ var2> tempfile` muss $ var2 in Anführungszeichen gesetzt werden, damit Tabs und neue Zeilen erhalten bleiben: 'echo" $ var2 "> tempfile`. In der awk-Zeile muss die Option -F nicht gesetzt werden, die Standard-Trennzeichen für awk sind leer und die Registerkarte und die Variable `$ i 'muss für die Shell` awk' verfügbar sein. $ 3 == '' $ i '' "tempFile" Beachten Sie, dass der Befehl awk doppelte Anführungszeichen enthält. Paulo vor 6 Jahren 0

1 Antwort auf die Frage

0
Paulo

Eine einfachere awkLösung könnte der Vergleich von $ 3 mit einem Regex sein.

awk '$3 ~ /alpha|beta|gamma|delta|epsilon/ ' tempFile

Übergeben der Liste als $var1

awk '$3 ~ /'"$"'/ ' tempFile

Wenn $ var1 eine Datei ist, können Sie sie mit cat an awk übergeben

awk '$3 ~ /'"$(cat IDs|tr ' ' '|')"'/ ' tempFile

Danke Paulo, ich werde immer mit den Zitaten der Bash verwirrt. Die zweite Lösung, die Sie mir geben, funktioniert gut. Ich denke aber, dass Grep einfacher ist. Gigiux vor 6 Jahren 0
Das Hauptproblem mit meinen realen Daten war, dass ich sie von Windows nach Linux exportierte. Ich musste folgendes tun: r -d '\ r' <file_dos> file_linux, damit der Befehl grep funktioniert. Gigiux vor 6 Jahren 0