Awk: match exacte string in regel

Ik heb dit bestand

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

En ik wil de exacte string 200 matchen met awk. Dus mijn resultaat zou moeten zijn

a deiauk Biking US 200 G 

Hier is mijn code

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

Maar daarna dat ik alle regels heb.

Reacties

  • Waarom verwacht je dat je awk code een enkele regel? Heb je zelfs de moeite genomen om te begrijpen wat dit moet doen?
  • Je awk zal i) het aantal keren dat je dit eerste veld hebt gezien, waarbij het voorlaatste veld ; ii) het eerste veld en iii) het voorlaatste veld. Waarom zou je verwachten dat het de hele regel afdrukt? Welke uitvoer krijg je eigenlijk?

Answer

Aangezien u een exacte overeenkomst wilt, kunt u == gebruiken?

$ 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 

Je kunt je match ook beperken met /^200$/:

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

Bewerken:

Ik heb je commando geprobeerd, en het zou moeten werken. Weet je zeker van je -F " "?

Comm ents

  • Ja -F ' ' is prima in mijn beschrijving. Ik weet niet ' waarom, maar ik heb nog steeds hetzelfde probleem

Antwoord

Met awk, alleen:

awk "$0~/ 200 /" file 

Of sed (\s komt overeen met elke witruimte):

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

A grep oplossing (-P voor perl regex):

grep -P "\s200\s" file 

Als het puur moet zijn bash:

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

Als u “niet zeker weet of er spaties, tabs of wat dan ook zijn ([[:space:]] is als \s, in de sed en grep oplossingen hierboven ):

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

Reacties

  • In grep het werkt ook zonder -P, grep '\s200\s' file

Antwoord

Ik denk van wel s zullen helpen. Hierdoor wordt alleen de regel met het patroon afgedrukt. In jouw geval is het patroon 200

grep "200" file-name 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *