Ik heb bijvoorbeeld het tekstdocument:
"Hello, I am the janitor and I have a headache The rabbit jumped over the red brick wall"
Ik wil tellen het aantal velden waarin de deelstring “hij” voorkomt. Ik wil niet het aantal “hij” in het bestand tellen, alleen het aantal velden.
Dus voor mijn voorbeeld zou het zoiets als dit moeten afdrukken:
Number of fields that contain "he" in record #1: 3 Number of fields that contain "he" in record #2: 2
Het moet een awk script zijn.
Reacties
- Wat heb je tot nu toe geprobeerd?
- Ik heb het volgende script geprobeerd: " {print " Aantal velden in record # " NR " met ' he ': " index ($ 0, " hij ")} en het ' werkt niet. Ik heb ook gsub geprobeerd, maar gsub telt elke keer dat ' he ' voorkomt, niet alleen de velden waarin ' hij ' is gevonden.
- Je moet de velden herhalen. Dit zou je moeten helpen.
- Heb je unix.stackexchange.com/questions verlaten / 550529 / … ?
- @JohnMike ook, plaats uw pogingen & hun resultaten in uw vraag , waar ze ' niet over het hoofd werden gezien.
Answer
De velden zijn genummerd vanaf 1
, en NF
bevat het aantal ervan. We kunnen ze dus herhalen met for (i = 1; i <= NF; i++) { ... }
, met $i
in de lus, verwijzend naar het betreffende veld. (i
is eigenlijk gewoon het nummer van het veld, we hebben de $
operator nodig om de daadwerkelijke inhoud van het veld te krijgen.)
En wat betreft het vinden of een waarde een bepaalde subtekenreeks bevat, is het gebruik van een regex het gemakkelijkst. s ~ /foo/
zou zien of de variabele s
overeenkomt met de string foo
waar dan ook, dwz of deze het als een substring. Nu wilt u misschien ook een hoofdletter zoeken, in welk geval bijv. [Ff]
zou werken in plaats van de f
. De haakjesgroep [...]
komt overeen met een van de karakters erin.
Natuurlijk heb je ook een teller nodig, maar dat is makkelijk, initialiseer gewoon een variabele naar nul voor de lus (bijv. count=0
) en verhoog als er “een overeenkomst is (count += 1
).
~ ~
Dus eigenlijk is een awk script om wat code uit te voeren voor elke regel / record van een bestand slechts
awk "{ some code }" < filename.txt
codeblok, de for
lus past, en er is ook een blok tussen accolades nodig { .. }
.
awk "{ for ( ... ) { some code } }`
En een if
werkt op dezelfde manier,
if (condition) { some code... }
(Ze zien er eigenlijk zoals for
en if
in C.)
En je kunt puntkommas gebruiken om uitspraken te scheiden, dus
awk "{ what to do before the loop; for ( ... ) { some code }; what to do after }`
Reacties
- hoe zou dat er echter uitzien als een compleet scriptbestand? I m met volledig verlies. Onze professor heeft ' niet over dit soort dingen gepraat.
- @JohnMike, nou, dat ' is gewoon het ding , Ik haat het echt om volledige antwoorden te geven voor huiswerk. Dat zou ongeveer alle onderdelen moeten zijn, als je de tijd hebt om er iets van te maken.
- Ik don ' t, en normaal gesproken zou niet ' niet om volledige antwoorden vragen, maar ik maak me zorgen over het krijgen van een A in deze klas. Ik ' ben een hetero A-student en heb meestal geen probleem met mijn comp sci-lessen, maar deze professor is berucht omdat hij kennis buiten de klas verwacht. Ik ' heb nog nooit unix / linux gebruikt, en ik heb hier echt moeite mee. Het huiswerk bestaat uit 20 opgaven, en deze 3, plus 2 in een andere post die ik heb gemaakt, zijn de enige die ik ' niet kan achterhalen. Ik heb bijna geen tijd meer, ' moet morgen worden ingeleverd.
- @JohnMike, probeer je wat stukjes bij elkaar te krijgen?SE is stom voor interactief heen en weer debuggen, maar je kunt je Q bewerken om een script toe te voegen als je een paar stappen vooruit krijgt, en dan kunnen we zien wat ' de stopper
- @JohnMike Gezien (a) de hier getoonde manier om de velden van elk record te herhalen met for lus, (b)
gsub
die je hebt geprobeerd in je verlaten bericht kan een doel accepteren om te presteren, bijvoorbeeldgsub("he","",$i)
(c) je hebt een basiscomp sci-achtergrond (d) je kunt online tools gebruiken zoals tutorialspoint.com/execute_bash_online.php om je huiswerk te maken, zelfs als je geen linux op je pc hebt, dan is er geen sterk excuus om niet te proberen je huiswerk op te lossen met de hier gegeven hulp. Probeer het in ieder geval en er zal hulp komen.
Antwoord
Gedaan door onderstaand awk-script
awk -v i="he" "{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}" file
uitvoer
Number of fields that contain he 3 in record 1 Number of fields that contain he 2 in record 2