Jeg har denne filen
a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z
Og jeg ønsker å matche den nøyaktige strengen 200 ved hjelp av awk
. Så resultatet mitt skal være
a deiauk Biking US 200 G
Her er koden min
awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt
Men etter at jeg har alle linjene.
Kommentarer
Svar
Siden du vil ha en nøyaktig samsvar, hvorfor ikke bruke ==
?
$ 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å begrense kampen din 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øvde kommandoen din, og den skulle fungere. Er du sikker på -F " "
?
Comm ents
- Ja
-F ' '
er greit i min handling. Jeg vet ikke ' hvorfor, men jeg har fortsatt det samme problemet
Svar
Med awk
, bare:
awk "$0~/ 200 /" file
Eller sed
(\s
samsvarer med hvilket som helst hvitt mellomrom):
sed -n "/\s200\s/p" file
A grep
løsning (-P
for perl regex):
grep -P "\s200\s" file
Hvis det må være rent bash
:
while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file
Hvis du ikke er sikker på om det er mellomrom, faner, hva som helst ([[:space:]]
er som \s
, i sed
og grep
løsningene ovenfor ):
while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
Kommentarer
- I
grep
det fungerer uten-P
også,grep '\s200\s' file
Svar
Jeg tror dette s vil hjelpe. Dette vil bare skrive ut linjen som inneholder mønster. I ditt tilfelle er mønsteret 200
grep "200" file-name
awk
-koden skal skrive ut en En linje? Gadd du til og med å forstå hva dette skulle gjøre?200
; ii) første felt og iii) nest siste felt. Hvorfor skulle du forvente at det skulle skrive ut hele linjen? Hvilken effekt får du egentlig?