Awk: genaue Zeichenfolge in Zeile

Ich habe diese Datei

a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z 

und ich Sie möchten die genaue Zeichenfolge 200 mit awk abgleichen. Mein Ergebnis sollte also

a deiauk Biking US 200 G 

sein. Hier ist mein Code

awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt 

Aber danach dass ich alle Zeilen habe.

Kommentare

  • Warum soll Ihr awk -Code a drucken? Haben Sie sich überhaupt die Mühe gemacht zu verstehen, was dies tun soll?
  • Ihre awk druckt i) wie oft Sie dieses erste Feld gesehen haben, in dem das vorletzte Feld ; ii) das 1. Feld und iii) das vorletzte Feld. Warum sollten Sie damit rechnen, dass die gesamte Zeile gedruckt wird? Welche Ausgabe erhalten Sie tatsächlich?

Antwort

Da Sie eine genaue Übereinstimmung wünschen, können Sie == verwenden.

$ cat >file a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z a auie auie 200 B b nrst nrst 200 C $ awk "$(NF-1)==200{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1 

Sie können Ihre Übereinstimmung auch mit /^200$/ einschränken:

$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1 

Bearbeiten:

Ich habe Ihren Befehl ausprobiert und er sollte funktionieren. Sind Sie sicher, dass Sie -F " "?

Comm ents

  • Ja -F ' ' ist in meiner Aktion in Ordnung. Ich ' weiß nicht warum, aber ich habe immer noch das gleiche Problem

Antwort

Mit awk nur:

awk "$0~/ 200 /" file 

Oder sed (\s entspricht einem beliebigen Leerzeichen):

sed -n "/\s200\s/p" file 

A grep Lösung (-P für Perl-Regex):

grep -P "\s200\s" file 

Wenn es rein sein muss bash:

while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file 

Wenn Sie nicht sicher sind, ob Leerzeichen oder Tabulatoren vorhanden sind ( ist wie \s in den obigen Lösungen sed und grep ):

while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file 

Kommentare

  • In grep es funktioniert auch ohne -P, grep '\s200\s' file

Antwort

Ich denke das s wird helfen. Dadurch wird nur die Zeile gedruckt, die das Muster enthält. In Ihrem Fall ist das Muster 200

grep "200" file-name 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.