Hvordan teller jeg antall felt der en understreng ligger i en fil ved hjelp av et awk-skript?

For eksempel har jeg tekstdokumentet:

"Hello, I am the janitor and I have a headache The rabbit jumped over the red brick wall" 

Jeg vil telle antall felt der understrengen «han» forekommer. Jeg vil ikke telle antall «han» i filen, bare antall felt.

Så for mitt eksempel, bør det skrive ut noe slikt:

Number of fields that contain "he" in record #1: 3 Number of fields that contain "he" in record #2: 2 

Det må være et awk-skript.

Kommentarer

  • Hva har du prøvd så langt?
  • Jeg har prøvd følgende skript: " {print " Antall felt i posten <" NR " som inneholder ' han ': " indeks ($ 0, " han ")} og det fungerer ikke '. Jeg prøvde også gsub, men gsub teller hver forekomst av ' he ', ikke bare feltene der ' han ' er funnet.
  • Du må gjenta over feltene. Dette skal hjelpe deg.
  • Har du forlatt unix.stackexchange.com/questions / 550529 / … ?
  • @JohnMike, vennligst legg forsøkene dine på & resultatene deres til spørsmålet ditt , der de ikke vil bli oversett '.

Svar

Feltene er nummerert fra 1, og NF inneholder antallet av dem. Så vi kan iterere over dem med for (i = 1; i <= NF; i++) { ... }, med $i inne i sløyfen som refererer til det aktuelle feltet. (i er faktisk bare nummeret på feltet, vi trenger operatøren $ for å få det faktiske innholdet i feltet.)

Og når det gjelder å finne ut om en verdi inneholder en bestemt understreng, er det enklest å bruke en regex. s ~ /foo/ vil se om variabelen s samsvarer med strengen foo hvor som helst, dvs. hvis den inneholder det som et underlag. Nå kan det også være lurt å også matche en stor bokstav, i hvilket tilfelle f.eks. [Ff] vil fungere i stedet for f. Brakettgruppen [...] samsvarer med hvilket som helst av tegnene inne.

Selvfølgelig trenger du også en teller, men det er enkelt, bare initialiser en variabel til null før sløyfen (f.eks. count=0), og øk hvis det er en samsvar (count += 1).

~ ~

Så, i utgangspunktet er et awk-skript for å kjøre kode for hver linje / post av en fil bare

awk "{ some code }" < filename.txt 

Inne i kodeblokk, for sløyfen passer, og det tar også en blokk i bukseseler { .. }.

awk "{ for ( ... ) { some code } }` 

Og en if fungerer på samme måte,

if (condition) { some code... } 

(De ser faktisk bare ut som for og if i C.)

Og du kan bruke semikolon for å skille utsagn, så

awk "{ what to do before the loop; for ( ... ) { some code }; what to do after }` 

Kommentarer

  • hvordan ville det se ut som en komplett skriptfil skjønt? Jeg m med fullstendig tap. Professoren vår snakket ikke ' om disse tingene.
  • @JohnMike, vel, at ' er bare tingen , Jeg hater virkelig å gi komplette svar på lekser. Det burde imidlertid dreie seg om alle brikkene hvis du har tid til å prøve å bygge noe ut av dem.
  • Jeg har ikke ' t, og jeg pleier å ville ikke ' t be om komplette svar, men jeg er bekymret for å få A i denne klassen. Jeg er ' Jeg er en rett student, og har vanligvis ikke noe problem med mine comp sci-klasser, men denne professoren er beryktet for å forvente kunnskap utenfor klassen. Jeg ' har aldri brukt unix / linux før, og jeg sliter veldig her. Leksene består av 20 problemer, og disse 3, pluss 2 i et annet innlegg jeg laget, er de eneste jeg ikke kan ' ikke finne ut av. Jeg går tom for tid, det ' skal være i morgen.
  • @JohnMike, prøv om du kan få noen brikker sammen?SE suger for interaktiv frem og tilbake feilsøking, men du kan redigere Q for å legge til et skript hvis du får et trinn eller to fremover, og så kan vi se hva ' er stopper
  • @JohnMike Med tanke på (a) måten som er vist her for å gjenta over filene til hver plate ved hjelp av for loop, (b) gsub som du har prøvd i det forlatte innlegget ditt kan godta et mål å utføre, dvs. gsub("he","",$i) (c) du har en grunnleggende comp sci bakgrunn (d) du kan bruke online verktøy som tutorialspoint.com/execute_bash_online.php for å lage leksene dine selv om du ikke har linux på pc-en din, så er det ingen sterk unnskyldning for ikke å prøve å løse leksene dine med hjelpen som er gitt her. Prøv i det minste, så vil hjelpen komme.

Svar

Gjort med nedenstående awk-skript

awk -v i="he" "{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}" file 

utgang

Number of fields that contain he 3 in record 1 Number of fields that contain he 2 in record 2 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *