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ó.
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, azazgsub("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