Jeg har denne fil
a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z
Og jeg ønsker at matche den nøjagtige streng 200 ved hjælp af awk
. Så mit resultat skal være
a deiauk Biking US 200 G
Her er min kode
awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt
Men efter at jeg fik alle linjer.
Kommentarer
Svar
Da du vil have et nøjagtigt match, hvorfor ikke bruge ==
?
$ 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 også begrænse din kamp med /^200$/
:
$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Rediger:
Jeg prøvede din kommando, og den skulle fungere. Er du sikker på din -F " "
?
Comm ents
- Ja
-F ' '
er fint i min ituaktion. Jeg ved ikke ' hvorfor, men jeg har stadig det samme problem
Svar
Med awk
, bare:
awk "$0~/ 200 /" file
Eller sed
(\s
matcher ethvert hvidt mellemrum):
sed -n "/\s200\s/p" file
A grep
løsning (-P
for perl regex):
grep -P "\s200\s" file
Hvis det skal være rent bash
:
while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file
Hvis du ikke er sikker på, om der er mellemrum, faner, hvad som helst ([[:space:]]
ligner \s
i sed
og grep
-løsningerne ovenfor ):
while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
Kommentarer
- I
grep
det fungerer uden-P
også,grep '\s200\s' file
Svar
Jeg tror, at dette s hjælper. Dette udskriver kun linjen, der indeholder mønster. I dit tilfælde er mønster 200
grep "200" file-name
awk
-kode skal udskrive en enkelt linje? Gik du engang med at forstå, hvad dette skulle gøre?200
; ii) det første felt og iii) det næstsidste felt. Hvorfor skulle du forvente, at det skulle udskrive hele linjen? Hvilket output får du faktisk?