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
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
grepse toimii ilman-Pmyösgrep '\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
awk-koodisi tulostavan Yksittäinen rivi? Halusitko edes ymmärtää, mitä tämän pitäisi tehdä?200; ii) 1. kenttä ja iii) viimeinen kenttä. Miksi luulet sen tulostavan koko rivin? Mitä tulosta todella saat?