Awk: vastaa tarkkaa merkkijonoa rivillä

Minulla on tämä tiedosto

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

Ja minä haluat täsmätä merkkijonon 200 käyttämällä awk. Joten tulos on

a deiauk Biking US 200 G 

Tässä on koodini

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

Mutta jälkeen että sain kaikki rivit.

Kommentit

  • Miksi odotat awk -koodisi tulostavan Yksittäinen rivi? Halusitko edes ymmärtää, mitä tämän pitäisi tehdä?
  • Awk tulostaa i) kuinka monta kertaa olet nähnyt tämän ensimmäisen kentän, jossa viimeinen kohta on 200; ii) 1. kenttä ja iii) viimeinen kenttä. Miksi luulet sen tulostavan koko rivin? Mitä tulosta todella saat?

Vastaa

Koska haluat tarkan haun, miksi et käytä ==?

$ 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 

Voit myös rajoittaa otteluasi /^200$/:

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

Muokkaa:

Yritin komentoasi, ja sen pitäisi toimia. Oletko varma -F " "?

Comm ents

  • Kyllä -F ' ' on hyvä minun mielessäni. En tiedä ' en tiedä miksi, mutta minulla on edelleen sama ongelma

Vastaa

Kun awk, vain:

awk "$0~/ 200 /" file 

Tai sed (\s vastaa mitä tahansa tyhjää tilaa):

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

A grep ratkaisu (-P perl-regexille):

grep -P "\s200\s" file 

Jos sen on oltava puhdas bash:

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

Jos et ole varma, onko välilyöntejä, sarkaimia, mitä tahansa ([[:space:]] on kuin \s, yllä olevissa sed – ja grep -ratkaisuissa ):

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

Kommentit

  • Kohdassa grep se toimii ilman -P myös grep '\s200\s' file

vastausta

Luulen thi s auttaa. Tämä tulostaa vain viivan, joka sisältää kuvion. Sinun tapauksessasi kuvio on 200

grep "200" file-name 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *