Kuinka lasken awk-komentosarjan avulla niiden kenttien määrän, joissa alimerkkijono on tiedostossa?

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

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 

Vastaa

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