Grep: conta il numero di partite per riga


26

Sto cercando di ottenere il numero di corrispondenze (in questo caso occorrenze di {o }) in ciascuna riga di un file .tex.

So che la -obandiera restituisce solo la partita, ma restituisce ogni partita su una nuova riga, anche combinata con la -nbandiera. Non so nulla di ciò su cui poterlo convogliare per contare le ripetizioni. Il -cflag restituisce solo il numero totale di corrispondenze nell'intero file - forse potrei eseguire il pipe di una riga alla volta per grep?

Risposte:


27
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

L'output sarà simile a:

3 1
1 2

Significato 3 occorrenze nella prima riga e 1 nella seconda.

Tratto da /programming//a/15366097/3378354 .


Grazie - google ha trovato molti hit regex su SU, ma non quello su SO, che non sembra nemmeno avere un tag regex. Non sortè strettamente necessario poiché l'output di grep è ordinato in base al numero di riga, ma suppongo sia una buona pratica prima uniq.
Chris H,

2
Probabilmente non taggato regexperché la regex è la parte facile.
Tom Zych,

È effettivamente necessario sort -n? Non esce comunque nell'ordine dei numeri di riga?
Tom Zych,

Hai ragione, sort -nnon è necessario. Grazie.
Moebius,

@TomZych, ho scoperto che avevi ragione, ma se avessi saputo che non avrei potuto chiedere. Il salto mentale da grep a tag: forse regex era un po 'troppo.
Chris H,

3

Dopo aver letto varie soluzioni, penso che questo sia l'approccio più semplice al problema:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

3
La migliore soluzione, secondo me. Potrebbe essere ancora più semplificato riducendo da un tubo: grep -o "matchingString" <<< $i | wc -l.
Benjamin W.

1
Gli ordini di grandezza saranno più lenti di altre opzioni
Rahul,

1

Sta usando grepun requisito? Ecco un'alternativa:

sed 's / [^ {}] // g' your_file | awk '{stampa NR, lunghezza}'

Le sedstrisce su tutti i caratteri diversi {e } (cioè, lasciando solo {e }caratteri), e poi i awkconteggi dei caratteri per ciascuna riga (che sono solo le {e }caratteri). Per eliminare le righe senza corrispondenze,

sed 's / [^ {}] // g' your_file | awk '/./ {stampa NR, lunghezza}'

Nota che la mia soluzione presuppone (richiede) che le stringhe che stai cercando siano caratteri singoli. La risposta di Moebius si adatta più facilmente alle stringhe multi-carattere. Inoltre, nessuna delle nostre risposte esclude occorrenze quotate o sfuggite ai caratteri / stringhe di interesse; per esempio,

{ "nullfunc() {}" }

sarebbe considerato contenere quattro caratteri di parentesi graffa.


grepnon era davvero un requisito, era proprio dove ho iniziato a cercare una soluzione, perché mi ha dato qualcosa di simile. Non ho mai avuto bisogno di awk, quindi se non avessi usato la risposta sopra, avrei usato questa come una possibilità per sperimentare - potrei ancora. Ciò che non sono riuscito a chiarire (ma non influisce su nessuna delle due risposte) è che volevo eseguire lo script una volta per parentesi, per aiutarmi a rintracciare una mancata corrispondenza (nel sorgente LaTeX, qui per una tabella) in cui si verificano la maggior parte delle coppie in una sola riga.
Chris H,

Non sono del tutto sicuro di cosa tu voglia dire "esegui lo script una volta per parentesi", ma se vuoi rintracciare una mancata corrispondenza del parentesi graffa, potresti provare qualcosa di simile sed 's/{[^{}]*}//g' your_file | grep –n '[{}]', in cui le sedstrisce (abbinate) si accoppiano. Se hai coppie nidificate, usa sed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …ripetendo s/{[^{}]*}//gtante volte quante sono le nidificazioni più profonde.
Scott,

Intendevo eseguire `sed 's / [^}] // g' your_file | awk '{print NR, length}' e 's / [^ {] // g' your_file | awk "{stampa NR, lunghezza}". In effetti ho un annidamento e allenarmi al livello più profondo mi è sembrato un lavoro ingrato. Trasformare molte righe in una manciata (ci sono alcuni casi in cui le parentesi graffe corrispondono solo su più righe per motivi validi) ha funzionato bene (uso jedit che evidenzia la parentesi corrispondente - per qualsiasi tipo di parentesi capisce - quindi l'ho fatto davvero ho solo bisogno di restringerlo).
Chris H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.