Ich lerne awk von der AWK-Programmiersprache und habe ein Problem mit einem der Beispiele.
Wenn ich $ 3 drucken wollte, wenn $ 2 gleich einem Wert ist (z. B. 1
), habe ich diesen Befehl verwendet, der gut funktioniert:
awk '$2==1 {print $3}' <infile> | more
Wenn ich jedoch 1 durch ein anderes Suchkriterium ersetze (z. B. findtext
), funktioniert der Befehl nicht:
awk '$1== findtext {print $3}' <infile> | more
Es gibt keine Ausgabe zurück und ich bin sicher, dass 'findtext' in der Eingabedatei vorhanden ist.
Ich habe es auch versucht, aber es funktioniert nicht:
awk '$1== "findtext" {print $3}' <infile> | more
Hier ist meine Testdatei mit dem Namen 'test' und sie enthält 9 Zeilen und 8 Felder, die durch Leerzeichen getrennt sind:
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
Folgendes habe ich getan 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?
Antworten:
Wenn Sie nach einer bestimmten Zeichenfolge suchen, setzen Sie Anführungszeichen darum:
Andernfalls geht awk davon aus, dass es sich um einen Variablennamen handelt.
quelle
awk '{ print $8 }'
Ihnen, was Sie erwarten würden?AWK
Implementierung liegen (überprüfen Sie es mitawk --version
), schauen Sie sich meine Antwort an, es funktioniert auchGAWK
undMAWK
.awk "$1 == \"findtext\" {print $3}"
Diese Methode verwendet Regexp, es sollte funktionieren:
quelle
Abhängig von der von
AWK
Ihnen verwendeten Implementierung==
ist dies in Ordnung oder nicht.Hast du es versucht
~
? Zum Beispiel, wenn Sie möchten, dass $ 1 "Hallo" ist:^
bedeutet $ 1 Start und$
ist $ 1 Ende.quelle
awk
nicht übereinstimmen==
, war aber erfolgreich~
.$1 == "hello"
und$1 ~ /^hello$/
. Sie sollten niemals das tun$1 ~ "^hello$"
, was in dieser Antwort gezeigt wird, da eine Zeichenfolge in einem regulären Ausdruck verwendet wird. Daher muss awk die Zeichenfolge vor der Verwendung in eine reguläre Zeichenfolge konvertieren, was Nebenwirkungen hat (man awk).Das ist für mich besser lesbar
quelle
Meine awk-Version ist 3.1.5.
Ja, die Eingabedatei ist durch Leerzeichen getrennt, keine Registerkarten.
Nach der Antwort von Arutaku habe ich Folgendes versucht:
Was hat nicht funktioniert (ich weiß nicht warum und vielleicht aufgrund meiner awk Version :),
Vielen Dank für Ihre Antworten, Kommentare und Hilfe!
quelle
ClNonZ<control-M>
nichtClNonZ
der Grund, warum ein RE-Teilübereinstimmungsvergleich mit grep oder "~" durchgeführt wurde "in awk findet es aber ein Gleichheitsvergleich nicht.Bitte versuchen Sie dies
oder
quelle