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