Hvordan tæller jeg antallet af felter, hvor en substring ligger i en fil, ved hjælp af et awk-script?

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 tælle antallet af felter, hvor understrengen “he” forekommer. Jeg ønsker ikke at tælle antallet af “han” i filen, bare antallet af felter.

Så for mit eksempel skal det udskrive noget som dette:

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

Det skal være et awk-script.

Kommentarer

  • Hvad har du prøvet hidtil?
  • Jeg har prøvet følgende script: " {print " Antal felter i post # " NR " indeholdende ' han ': " indeks ($ 0, " han ")} og det fungerer ikke '. Jeg prøvede også gsub, men gsub tæller enhver forekomst af ' he ', ikke kun de felter, hvor ' han ' er fundet.
  • Du skal gentage markerne. Dette skal hjælpe dig.
  • Har du forladt unix.stackexchange.com/questions / 550529 / … ?
  • @JohnMike, sæt venligst dine forsøg & deres resultater i dit spørgsmål , hvor de ikke overses '.

Svar

Felterne er nummereret startende fra 1 og NF indeholder antallet af dem. Så vi kan gentage dem med for (i = 1; i <= NF; i++) { ... } med $i inde i sløjfen, der henviser til det pågældende felt. (i er faktisk bare nummeret på feltet, vi har brug for $ operatøren for at få det faktiske indhold af feltet.)

Og hvad angår at finde ud af, om en værdi indeholder en bestemt understreng, er det nemmest at bruge en regex. s ~ /foo/ ville se, om variablen s matcher strengen foo hvor som helst, dvs. hvis den indeholder det som et underlag. Nu vil du muligvis også matche et stort bogstav, i hvilket tilfælde f.eks. [Ff] fungerer i stedet for f. Beslagsgruppen [...] matcher et hvilket som helst af tegnene indeni.

Selvfølgelig har du også brug for en tæller, men det er nemt, initialiser bare en variabel til nul før sløjfen (f.eks. count=0) og øges, hvis der er et match (count += 1).

~ ~

Så grundlæggende er et awk-script til at køre en kode for hver linje / post i en fil bare

awk "{ some code }" < filename.txt 

Inde i kodeblok for loop passer, og det tager også en blok i seler { .. }.

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

Og en if fungerer ens,

if (condition) { some code... } 

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

Og du kan bruge semikolon til at adskille udsagn, så

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

Kommentarer

  • hvordan ser det dog ud som en komplet scriptfil? I m med et fuldstændigt tab. Vores professor talte ikke ' t om disse ting.
  • @JohnMike, ja, at ' er bare sagen , Jeg hader virkelig at give komplette svar til lektier. Det skal dog handle om alle brikkerne, hvis du har tid til at prøve at bygge noget ud af dem.
  • Jeg don ' t, og jeg normalt ville ' ikke bede om komplette svar, men jeg er bekymret for at få et A i denne klasse. Jeg ' er en lige studerende og har normalt ikke noget problem med mine komp. Sci-klasser, men denne professor er berygtet for at forvente uden for klassens viden. Jeg ' har aldrig brugt unix / linux før, og jeg kæmper virkelig her. Hjemmearbejdet består af 20 problemer, og disse 3 plus 2 i et andet indlæg, jeg lavede, er de eneste, jeg kan ' ikke finde ud af. Jeg er ved at løbe tør for tid, den ' forventes inden i morgen.
  • @JohnMike, prøv hvis du kan få nogle stykker sammen?SE suger efter interaktiv frem og tilbage debugging, men du kan redigere din Q for at tilføje et script, hvis du får et trin eller to fremad, og så kan vi se, hvad ' er stop
  • @JohnMike I betragtning af (a) den her viste måde at gentage over fielserne i hver post ved hjælp af for loop, (b) gsub som du har prøvet i dit forladte indlæg kan acceptere et mål at udføre dvs. gsub("he","",$i) (c) du har en grundlæggende comp sci-baggrund (d) du kan bruge onlineværktøjer som tutorialSex.com/execute_bash_online.php for at lave dit hjemmearbejde, selvom du ikke har linux på din pc, så er der ingen stærk undskyldning for ikke at forsøge at løse dit hjemmearbejde med hjælp her. Prøv i det mindste, så kommer der hjælp.

Svar

Udført med nedenstående awk-script

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

output

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *