Awk: matcha exakt sträng i rad

Jag har den här filen

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

Och jag vill matcha den exakta strängen 200 med awk. Så mitt resultat ska vara

a deiauk Biking US 200 G 

Här är min kod

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

Men efter att jag har alla rader.

Kommentarer

  • Varför förväntar du dig att din awk -kod ska skriva ut en En rad? Har du ens brytt dig om att förstå vad det här ska göra?
  • Din awk kommer att skriva ut i) hur många gånger du har sett detta första fält där det näst sista fältet är 200; ii) 1: a fältet och iii) det näst sista fältet. Varför skulle du förvänta dig att det skulle skriva ut hela raden? Vilken effekt får du egentligen?

Svar

Eftersom du vill ha en exakt matchning, varför inte använda ==?

$ 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 

Du kan också begränsa din matchning med /^200$/:

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

Redigera:

Jag försökte ditt kommando och det ska fungera. Är du säker på din -F " "?

Comm ents

  • Ja -F ' ' är bra i min ituaction. Jag vet inte ' varför men jag har fortfarande samma problem

Svar

Med awk, bara:

awk "$0~/ 200 /" file 

Eller sed (\s matchar alla vita utrymmen):

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

A grep lösning (-P för perl regex):

grep -P "\s200\s" file 

Om det måste vara rent bash:

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

Om du inte är säker på om det finns mellanslag, flikar, vad som helst ([[:space:]] är som \s, i sed och grep -lösningarna ovan ):

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

Kommentarer

  • I grep det fungerar utan -P också, grep '\s200\s' file

Svar

Jag tror att detta s hjälper. Detta skriver bara ut raden som innehåller mönster. I ditt fall är mönstret 200

grep "200" file-name 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *