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
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
awk
-kod ska skriva ut en En rad? Har du ens brytt dig om att förstå vad det här ska göra?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?