Folosind un script awk, cum număr numărul câmpurilor în care se află un șir într-un fișier?

De exemplu, am documentul text:

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

Vreau să număr numărul câmpurilor în care apare șirul „el”. Nu vreau să număr numărul de „el” din fișier, doar numărul de câmpuri.

Deci, pentru exemplul meu, ar trebui să imprime ceva de genul acesta:

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

Trebuie să fie un script awk.

Comentarii

  • Ce ați încercat până acum?
  • Am încercat următorul script: " {print " Numărul de câmpuri din înregistrarea # " NR " care conține ' el ': " index ($ 0, " el ")} și nu funcționează '. Am încercat și gsub, dar gsub numără fiecare apariție a ' el ', nu doar câmpurile în care ' el ' este găsit.
  • Trebuie să iterați peste câmpuri. Aceasta ar trebui să vă ajute.
  • Ați abandonat unix.stackexchange.com/questions / 550529 / … ?
  • De asemenea, @JohnMike, vă rugăm să puneți încercările dvs. & rezultatele lor în întrebarea dvs. , unde ' nu vor fi trecute cu vederea.

Răspuns

Câmpurile sunt numerotate începând de la 1 și NF conține numărul acestora. Deci, putem itera peste ele cu for (i = 1; i <= NF; i++) { ... }, cu $i în bucla care se referă la câmpul în cauză. (i este de fapt doar numărul câmpului, avem nevoie de operatorul $ pentru a obține conținutul real al câmpului.)

Și în ceea ce privește găsirea dacă o valoare conține un anumit sub șir, utilizarea unui regex este cel mai ușor. s ~ /foo/ ar vedea dacă variabila s se potrivește cu șirul foo oriunde, adică dacă conține ca substring. Acum, poate doriți, de asemenea, să potriviți o literă cu majusculă, caz în care de ex. [Ff] ar funcționa în locul f. Grupul de paranteze [...] se potrivește cu oricare dintre caracterele din interior.

Desigur, veți avea nevoie și de un contor, dar este ușor, inițializați o variabilă la zero înainte de buclă (de ex., count=0) și creșteți dacă există „o potrivire (count += 1).

~ ~

Deci, practic, un script awk pentru a rula un cod pentru fiecare linie / înregistrare a unui fișier este doar

awk "{ some code }" < filename.txt 

În interiorul bloc de cod, bucla for se potrivește și are și un bloc între paranteze { .. }.

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

Și un if funcționează similar,

if (condition) { some code... } 

(De fapt, arată doar cum ar fi for și if în C.)

Și puteți utiliza punct și virgula pentru a separa declarațiile, deci

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

Comentarii

  • cum ar arăta acest lucru ca un fișier script complet? I m la o pierdere completă. Profesorul nostru nu ' nu a vorbit despre aceste lucruri.
  • @JohnMike, ei bine, ' este doar un lucru , Chiar urăsc să dau răspunsuri complete pentru teme. Ar trebui să fie vorba despre toate piesele, totuși, dacă aveți timp să încercați să construiți ceva din ele.
  • Nu ' t și în mod normal ' nu ar cere răspunsuri complete, dar sunt îngrijorat de obținerea unui A în această clasă. Eu ' sunt un student drept, și de obicei nu am probleme cu orele mele de informatică, dar acest profesor este renumit pentru așteptarea unor cunoștințe în afara clasei. ' nu am mai folosit unix / linux până acum și chiar mă lupt aici. Tema constă în 20 de probleme, iar aceste 3, plus 2 într-o altă postare pe care am făcut-o, sunt singurele pe care nu le pot ' să-mi dau seama. Îmi lipsesc timpul, ' urmează să vină mâine.
  • @JohnMike, încercați dacă puteți obține câteva piese împreună?SE suge pentru depanare interactivă înainte și înapoi, dar puteți edita Q-ul pentru a adăuga un script dacă obțineți un pas sau doi înainte și apoi putem vedea ce ' este stopper
  • @JohnMike Având în vedere (a) modul prezentat aici pentru a itera peste fielurile fiecărei înregistrări folosind bucla for, (b) gsub pe care ați încercat-o în postarea abandonată poate accepta o țintă pentru a efectua, adică gsub("he","",$i) (c) aveți un fundal de bază în domeniul comp sci (d) puteți utiliza instrumente online precum tutorialspoint.com/execute_bash_online.php pentru a vă face temele chiar dacă nu aveți linux în computer, atunci nu există nicio scuză puternică pentru a nu încerca să vă rezolvați temele cu ajutorul oferit aici. Încercați cel puțin, iar ajutorul va sosi.

Răspundeți

Efectuat de scriptul awk

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

ieșire

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *