it-swarm.com.de

awk Drucke Spalte $ 3 wenn $ 2 == ein bestimmter Wert?

Ich lerne awk aus der Programmiersprache awk und werde von diesem Beispiel gestört.

Wenn ich $ 3 ausgeben möchte, wenn $ 2 einem Wert entspricht (z. B. '1') und ich diesen Befehl verwendet habe, der einwandfrei funktioniert:

awk '$2==1 {print $3}' <infile> | more

Wenn ich jedoch 1 durch ein anderes Suchkriterium ersetze, zum Beispiel 'findtext', funktioniert dieser Befehl nicht.

awk '$1== findtext {print $3}' <infile> | more

Dies gibt keine Ausgabe zurück und ich bin sicher, dass das, was ich in 'findtext' eingegeben habe, an dieser Stelle vorhanden war. Stimmt etwas mit meiner Syntax nicht?

Ich habe es versucht, aber es funktioniert nicht:

awk '$1== "findtext" {print $3}' <infile> | more

Aber wenn ich es mache

grep findtext <infile>  ## This does give me output

Der Findtext ist in der $ 1 vorhanden, da ich doppelt geprüft habe.

Hier ist meine Testdatei mit dem Namen 'test', die beispielsweise 9 Zeilen und 8 Felder und ein Leerzeichen enthält:

1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

Hier ist was ich getan habe und die Ausgabe:

$awk '$8 == "ClNonZ" {print $3}' test 

$ grep ClNonZ test 
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

Ich erwarte, dass dies die $ 3 sind, die "ClNonZ" in ihren $ 8 haben.

0.180467091 
0.010615711 
0.492569002

Ich weiß nicht, warum der Befehl awk nichts zurückgegeben hat. irgendwelche Gedanken?

99
user1687130

Wenn Sie nach einer bestimmten Zeichenfolge suchen, setzen Sie sie in Anführungszeichen:

awk '$1 == "findtext" {print $3}'

Andernfalls geht awk davon aus, dass es sich um einen Variablennamen handelt.

112
Rob Davis

Diese Methode benutzt regexp und sollte funktionieren:

awk '$2 ~ /findtext/ {print $3}' <infile>
29
Ell

Abhängig von der AWK Implementierung verwenden Sie == ist ok oder nicht.

Hast du es versucht ~ ?. Zum Beispiel, wenn Sie möchten, dass $ 1 "Hallo" ist:

awk '$1 ~ /^hello$/{ print $3; }' <infile>

^ bedeutet $ 1 Start und $ ist $ 1 Ende.

17
arutaku

Das ist für mich besser lesbar

awk '{if ($2 ~ /findtext/) print $3}' <infile>
2
user2773013

Meine awk Version ist 3.1.5.

Ja, die Eingabedatei ist durch Leerzeichen getrennt, keine Tabulatoren.

Nach der Antwort von Arutaku habe ich Folgendes versucht:

awk '$8 ~ "ClNonZ"{ print $3; }' test  
0.180467091
0.010615711
0.492569002


$ awk '$8 ~ "ClNonZ" { print $3}' test  
0.180467091
0.010615711
0.492569002

Was hat nicht funktioniert (ich weiß nicht warum und vielleicht aufgrund meiner awk Version :),

$awk '$8 ~ "^ClNonZ$"{ print $3; }' test
$awk '$8 == "ClNonZ" { print $3 }' test

Vielen Dank für Ihre Antworten, Kommentare und Hilfe!

2
user1687130