Minulla on esimerkiksi tekstiasiakirja:
"Hello, I am the janitor and I have a headache The rabbit jumped over the red brick wall"
Haluan laskea niiden kenttien lukumäärä, joissa alimerkkijono ”he” esiintyy. En halua laskea tiedostossa olevan ”he”: n määrää, vain kenttien lukumäärää.
Joten minun pitäisi esimerkkinä tulostaa jotain tällaista:
Number of fields that contain "he" in record #1: 3 Number of fields that contain "he" in record #2: 2
Sen on oltava awk-komentosarja.
Kommentit
- Mitä olet kokeillut tähän mennessä?
- Olen kokeillut seuraavaa komentosarjaa: " {print " Kenttien määrä tietueessa # " NR " joka sisältää ' he ': " -hakemisto ($ 0, " he ")} ja se ei toimi '. Yritin myös gsubia, mutta gsub laskee kaikki ' he ' -tapahtumat, ei vain kentät, joissa ' hän ' löytyy.
- Sinun täytyy toistaa kentät. Tämän pitäisi auttaa sinua.
- Oletko hylännyt unix.stackexchange.com/questions / 550529 / … ?
- Myös @JohnMike, laita yrityksesi & tulokseen kysymykseesi , jossa heitä ' ei unohdeta.
vastaus
Kentät numeroidaan alkaen 1
ja NF
sisältää niiden määrän. Joten voimme toistaa ne yli for (i = 1; i <= NF; i++) { ... }
, jolloin silmukan sisällä $i
viittaa kyseiseen kenttään. (i
on itse asiassa vain kentän numero, tarvitsemme operaattorin $
saadaksesi kentän todellisen sisällön.)
Ja jos etsitään, sisältääkö arvo tietyn alaosan, regexin käyttäminen on helpointa. s ~ /foo/
näkee, vastaako muuttuja s
merkkijonoa foo
missä tahansa, ts. jos se sisältää se alaosana. Nyt saatat haluta sovittaa myös ison kirjaimen, jolloin esim. [Ff]
toimisi f
-tilan sijaan. Sulujen ryhmä [...]
vastaa mitä tahansa sisällä olevista merkeistä.
Tarvitset tietysti myös laskurin, mutta se on helppoa, vain alusta muuttuja nollaan ennen silmukkaa (esim. count=0
) ja lisäys, jos siellä on ”sa” (count += 1
).
~ ~
Joten periaatteessa awk-komentosarja jonkin koodin suorittamiseksi tiedoston jokaiselle riville / tietueelle on vain
awk "{ some code }" < filename.txt
koodilohko, for
-silmukka sopii, ja se vie myös lohkon aaltosulkeisiin { .. }
.
awk "{ for ( ... ) { some code } }`
Ja if
toimii samalla tavalla,
if (condition) { some code... }
(Ne näyttävät oikeastaan vain kuten for
ja if
C: ssä.)
Ja voit erottaa lauseita puolipisteillä, joten
awk "{ what to do before the loop; for ( ... ) { some code }; what to do after }`
Kommentit
- miltä se näyttää täydellisenä komentotiedostona? I m tappiolla. Professorimme ei ' t puhunut näistä asioista.
- @JohnMike, no, että ' on vain asia , Inhoan todella antaa täydellisiä vastauksia kotitehtäviin. Tämän pitäisi kuitenkin koskea kaikkia kappaleita, jos sinulla on aikaa yrittää rakentaa niistä jotain.
- En halua ' t, ja normaalisti en kysyisi täydellisiä vastauksia ', mutta olen huolissani A-luokan saamisesta tässä luokassa. Olen ' olen suora opiskelija, eikä minulla yleensä ole ongelmia comp sci-luokkani kanssa, mutta tämä professori on tunnetusti odottanut luokan ulkopuolista tietoa. En ' en ole koskaan käyttänyt unix / linuxia aikaisemmin, ja olen todella kamppaileva täällä. Kotitehtävät koostuvat 20 ongelmasta, ja nämä 3 plus 2 toisessa kirjoittamassani viestissä ovat ainoita, joita ' en voi selvittää. Aika on loppumassa, se ' erääntyy huomenna.
- @JohnMike, yritäkö saada kappaletta yhteen?SE imee interaktiivista edestakaista virheenkorjausta, mutta voit muokata Q: ta lisätäksesi komentosarjan, jos saat askeleen tai kaksi eteenpäin, ja sitten voimme nähdä, mitä ' s tulppa
- @JohnMike Ottaen huomioon (a) tässä esitetyn tavan toistaa jokaisen tietueen kentät käyttämällä silmukkaa (b)
gsub
, jota olet kokeillut hylätty viesti voi hyväksyä tavoitteen suoritettavaksi, ts.gsub("he","",$i)
(c) sinulla on perustietotekniikan tausta (d) voit käyttää verkkotyökaluja, kuten tutorialspoint.com/execute_bash_online.php tehdäksesi kotitehtäväsi, vaikka sinulla ei olisikaan linuxia tietokoneellasi, ei ole mitään vahvaa tekosyytä olla yrittämättä ratkaista kotitehtäviäsi täällä annetulla avulla. Ainakin kokeile, ja apua tulee.
Vastaa
Tehty alle awk-komentosarjan
awk -v i="he" "{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}" file
lähtö
Number of fields that contain he 3 in record 1 Number of fields that contain he 2 in record 2