Egy awk szkript használatával hogyan számolhatom meg azoknak a mezőknek a számát, amelyekben egy sztring egy fájlban található?

Például megvan a szöveges dokumentum:

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

Számolni akarok azoknak a mezőknek a száma, amelyekben az “he” alszöveg előfordul. Nem a fájl “he” számát akarom megszámolni, csak a mezők számát.

Tehát a példámhoz ilyesmit kell kinyomtatnia:

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

Egy awk parancsfájlnak kell lennie.

Megjegyzések

  • Mit próbáltál eddig?
  • Kipróbáltam a következő szkriptet: " {print " Mezők száma a (z) # rekordban " NR " div id = “e1168a2e1b”>

he ': " index ($ 0, " he ")}, és nem működik '. Kipróbáltam a gsub-ot is, de a gsub a ' he ' minden előfordulását beszámítja, nem csak azokat a mezőket, amelyekben ' he ' megtalálható.

  • Iterálni kell a mezők felett. Ez segít Önnek.
  • Elhagyta a unix.stackexchange.com/questions / 550529 / … ?
  • @JohnMike is, kérjük, tegye a kísérleteit & az eredményeikre a kérdésedbe , ahol ' nem hagyják figyelmen kívül.
  • Válasz

    A mezők 1 és NF tartalmazza ezek számát. Tehát iterálhatunk rájuk a for (i = 1; i <= NF; i++) { ... } vel, a hurok belsejében pedig a div div <= id = "86e6a4caeb">

    vel hivatkozhatunk a kérdéses mezőre. (A i valójában csak a mező száma, a mező tényleges tartalmának megszerzéséhez szükségünk van a $ operátorra.)

    Ami pedig annak megállapítását illeti, hogy egy érték tartalmaz-e egy adott részt, a regex használata a legegyszerűbb. s ~ /foo/ megnézné, hogy a s változó bárhol megegyezik-e a foo karakterlánccal, azaz tartalmaz-e ez mint részrész. Most érdemes nagybetűvel is egyeznie, ebben az esetben pl. A [Ff] a f helyett működne. A [...] zárójelcsoport megegyezik a benne szereplő karakterek bármelyikével.

    Természetesen szükséged lesz számlálóra is, de ez könnyű, csak inicializálj egy változót nulla a ciklus előtt (pl. count=0) és növekmény, ha “egyezik” (count += 1).

    ~ ~

    Tehát alapvetően egy awk szkript, amely futtat valamilyen kódot a fájl minden sorához / rekordjához, csak

    awk "{ some code }" < filename.txt 

    A kódblokk, a for hurok illeszkedik, és zárójelbe is vesz egy blokkot { .. }.

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

    És egy if hasonlóan működik,

    if (condition) { some code... } 

    (valójában csak mint a for és a if a C-ben.)

    És pontosvesszővel is el lehet különíteni az utasításokat, így

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

    Megjegyzések

    • mégis hogy nézne ki teljes szkriptfájlként? I m teljes veszteséggel. Professzorunk nem ' nem beszélt erről a dologról.
    • @JohnMike, nos, hogy ' csak ez a dolog , Nagyon utálok teljes választ adni a házi feladatokra. Ennek minden darabról szólnia kell, ha van ideje arra, hogy megpróbáljon belőlük valamit felépíteni.
    • Nem ' t, és általában nem kérnék teljes válaszokat, de aggódom, hogy kapok-e A-t ebben az osztályban. Én ' egyenes hallgató vagyok, és általában nincs problémám a comp sci óráimmal, de ez a professzor arról híres, hogy osztályon kívüli tudást vár. Én ' még soha nem használtam az unix / linux-ot, és itt nagyon küzdök. A házi feladat 20 problémából áll, és csak ezt a 3-ot, plusz 2-t egy másik általam készített bejegyzésben ' nem tudom kitalálni. Elfogy az időm, ' holnapra esedékes.
    • @JohnMike, próbáld meg, tudsz-e összeszedni néhány darabot?Az SE elnyeri az interaktív oda-vissza hibakeresést, de szerkesztheti Q-ját egy szkript hozzáadásához, ha kap egy-két lépést előre, és akkor láthatjuk, mi ' dugó
    • @JohnMike Figyelembe véve (a) az itt bemutatott módszert az egyes rekordok mezőinek ismétléséhez a ciklushoz, (b) gsub, amelyet megpróbált elhagyott bejegyzésed elfogadhat egy célt, azaz gsub("he","",$i) (c) alapszintű comp sci háttered van (d) használhatsz online eszközöket, például tutorialspoint.com/execute_bash_online.php , hogy a házi feladatot akkor is elkészíthesse, ha még nincs linux a számítógépén, akkor nincs erős mentség arra, hogy ne próbálja meg megoldani a házi feladatát az itt megadott segítséggel. Legalább próbálkozzon, és segítség érkezik.

    Válasz

    Az awk szkript alatt

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

    kimenet

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

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük