Utilizzando uno script awk, come faccio a contare il numero di campi in cui si trova una sottostringa in un file?

Ad esempio, ho il documento di testo:

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

Voglio contare il numero di campi in cui ricorre la sottostringa “lui”. Non voglio contare il numero di “lui” nel file, solo il numero di campi.

Quindi, per il mio esempio, dovrebbe stampare qualcosa del genere:

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

Deve essere uno script awk.

Commenti

  • Cosa hai provato finora?
  • Ho provato il seguente script: " {print " Numero di campi nel record # " NR " contenente ' he ': " index ($ 0, " egli ")} e ' t funziona. Ho anche provato gsub, ma gsub conta ogni occorrenza di ' he ', non solo i campi in cui ' he ' è stato trovato.
  • È necessario scorrere i campi. Questo dovrebbe aiutarti.
  • Hai abbandonato unix.stackexchange.com/questions / 550529 / … ?
  • Anche @JohnMike, inserisci i tuoi tentativi & i risultati nella tua domanda , dove ' non verrà trascurato.

Risposta

I campi sono numerati a partire da 1 e NF ne contiene il numero. Quindi possiamo iterare su di essi con for (i = 1; i <= NF; i++) { ... }, con $i allinterno del ciclo che fa riferimento al campo in questione. (i è in realtà solo il numero del campo, abbiamo bisogno delloperatore $ per ottenere il contenuto effettivo del campo.)

E come per trovare se un valore contiene una particolare sottostringa, usare una regex è più semplice. s ~ /foo/ vedrebbe se la variabile s corrisponde alla stringa foo ovunque, cioè se contiene come sottostringa. Ora, potresti anche voler abbinare anche una lettera maiuscola, nel qual caso ad es. [Ff] funzionerebbe al posto di f. Il gruppo parentesi [...] corrisponde a uno qualsiasi dei caratteri allinterno.

Ovviamente avrai anche bisogno di un contatore, ma è facile, basta inizializzare una variabile a zero prima del ciclo (ad es. count=0) e incrementa se “sa match (count += 1).

~ ~

Quindi, in pratica, uno script awk per eseguire del codice per ogni riga / record di un file è solo

awk "{ some code }" < filename.txt 

Dentro il blocco di codice, il ciclo for si adatta e accetta anche un blocco tra parentesi graffe { .. }.

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

E un if funziona in modo simile,

if (condition) { some code... } 

(in realtà sembrano solo come for e if in C.)

E puoi usare il punto e virgola per separare le istruzioni, quindi

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

Commenti

  • ma come sarebbe un file di script completo? I sono completamente perso. Il nostro professore non ' non ha parlato di queste cose.
  • @JohnMike, beh, questo ' è la cosa giusta , Odio davvero dare risposte complete per i compiti. Dovrebbe trattarsi di tutti i pezzi, però, se hai il tempo di provare a costruirci qualcosa.
  • Io non ' t, e normalmente ' t chiedere risposte complete, ma sono preoccupato di ottenere un A in questa classe. Sono ' uno studente etero e di solito non ho problemi con le mie lezioni di informatica, ma questo professore è noto per aspettarsi conoscenze fuori dalla classe. ' non ho mai usato unix / linux prima dora e sto davvero lottando qui. Il compito è composto da 20 problemi, e questi 3, più 2 in un altro post che ho fatto, sono gli unici che posso ' capire. Il tempo è scaduto, ' è previsto per domani.
  • @JohnMike, provi se riesci a mettere insieme alcuni pezzi?SE fa schifo per il debug interattivo avanti e indietro, ma puoi modificare la tua Q per aggiungere uno script se ottieni uno o due passaggi in avanti, e poi possiamo vedere cosa è ' stopper
  • @JohnMike Considerando (a) il modo mostrato qui per iterare sui campi di ogni record utilizzando il ciclo for, (b) gsub che hai provato in il tuo post abbandonato può accettare un obiettivo da eseguire, ad esempio gsub("he","",$i) (c) hai una formazione di base sulla composizione (d) puoi utilizzare strumenti online come tutorialspoint.com/execute_bash_online.php per fare i compiti anche se non hai Linux nel tuo pc, allora non ci sono scuse valide per non provare a risolvere i tuoi compiti con laiuto qui fornito. Almeno fai un tentativo e arriverà laiuto.

Rispondi

Fatto da sotto awk script

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

output

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *