Jeg har en tekstfil, der indeholder tweets, og jeg skal tælle det antal gange, et ord er nævnt i tweeten F.eks. Indeholder filen:

Apple iPhone X is going to worth a fortune The iPhone X is Apple"s latest flagship iPhone. How will it pit against it"s competitors? 

Og lad os sige, at jeg vil tælle, hvor mange gange ordet iPhone er nævnt i filen. Så her har jeg prøvet.

cut -f 1 Tweet_Data | grep -i "iPhone" | wc -l 

det fungerer bestemt, men jeg er forvirret over kommandoen “wc” i unix. Hvad er forskellen hvis jeg prøver noget som:

cut -f 1 Tweet_Data | grep -c "iPhone" 

hvor -c bruges i stedet? Begge disse giver forskellige resultater i en stor fil fuld af tweets, og jeg er forvirret om hvordan det fungerer. Hvilken metode er den korrekte måde at tælle forekomsten på?

Kommentarer

Svar

Med et sådant krav ville jeg brug en GNU grep (til -o option ), derefter send den gennem wc for at tælle det samlede antal forekomster:

$ grep -o -i iphone Tweet_Data | wc -l 3 

Almindelig grep -c på data tæller antallet af linjer der matcher, ikke det samlede antal ord der matcher. Brug af -o -indstillingen fortæller grep at outputte hvert match på sin egen linje, uanset hvor mange gange matchet blev fundet i den oprindelige linje.

wc -l fortæller wc hjælpeprogrammet til at tælle antallet af linjer. Når grep sætter hver kamp i sin egen linje, er dette det samlede antal forekomster af ordet i inputet.


Hvis GNU grep ikke er tilgængelig (eller ønsket), kan du omdanne input med tr, så hvert ord er på sin egen linje, brug derefter grep -c til at tælle:

$ tr "[:space:]" "[\n*]" < Tweet_Data | grep -i -c iphone 3 

Svar

Den nemmeste metode er,

grep -wc "your_text" FileName 

for dig bliver det,

grep -wc "iPhone" Tweet_Data 

Kommentarer

  • Meget rent svar, men hvis du matcher et ord som ' cool ' du vil kun matche cool og IKKE ccooll, så vær opmærksom på, at mellemrum omkring ordet betyder.
  • Resultatet bliver forkert, når ordet forekommer mere end én gang i en linje.

Skriv et svar

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