GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere l'ennesima riga dopo una presa?

Non c'è niente di sbagliato nelle due risposte precedenti, ma ho pensato di farti sapere che trovare la terza riga dopo uno schema può essere fatto in un singolo sed chiama:

sed -n "/four/ { n; n; p }" SourceData.txt

Poiché un singolo programma fa il lavoro, questo è più efficiente rispetto all'esecuzione di più filtri. Il comando precedente emette la terza riga dopo ogni istanza di "four", tranne quando ciò si verifica nuovamente in una delle due righe successive a una corrispondenza (anche le altre soluzioni non gestiscono questo caso nel modo previsto); inoltre, non viene generato alcun output se il modello si trova nell'ultima o nella penultima riga del file, che potrebbe essere o meno ciò che desideri.

Per abbinare solo la prima istanza:

sed -n "/four/ { n; n; p; q }" SourceData.txt

(Nota che questa risposta è il più efficiente possibile, terminando la scansione non appena viene trovata la corrispondenza.)

Aggiungo questa soluzione perché vale la pena conoscere sed e, nonostante la sua sintassi piuttosto scoraggiante (le espressioni regolari sono già abbastanza brutte!), spesso può essere estremamente utile. Questo tutorial è una buona introduzione.


Questa soluzione stampa la riga corrente se c'era una corrispondenza due righe fa. È leggermente diverso da poche altre risposte perché non perderà un'altra corrispondenza anche se si verifica subito dopo la corrispondenza precedente.

awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'

Ogni volta che c'è una corrispondenza, le informazioni vengono memorizzate in t[0] . Con ogni riga il t l'array viene spostato (incluso lo spostamento t[-1] a t[0] per reimpostare il valore di t[0] ). La riga viene stampata se l'array indica che c'era una corrispondenza due righe fa.

Puoi facilmente impostare un ritardo diverso (ad es. delay=7 ) o utilizzare un altro modello (ad es. /sda[[:digit:]]/ )


Puoi usare questa espressione (input.txt ):

grep "four" -A 2 input.txt | tail -n 1

L'output è:

six 6

Il grep l'opzione "-A 2" indica che vengono emesse due righe dopo la riga corrispondente.
E il tail l'opzione "-n 1" indica che solo l'ultimo 1 vengono restituite le righe di questo risultato.


Linux
  1. Ordina con l'ordinamento dalla riga di comando

  2. Come fermare il comando Trova dopo la prima partita?

  3. Come spostare una riga in un file di testo su o giù di una riga?

  4. Restituire solo la parte di una linea dopo uno schema corrispondente?

  5. Come ottenere la somma Md5 dei contenuti di una directory come una somma?

Come ottenere la dimensione di una directory in Linux

Come ottenere il massimo da Qmmp 1.0

Come ottengo un equivalente di /dev/one in Linux

Come ottenere la versione del driver nvidia dalla riga di comando?

sed - inserisce riga dopo X righe dopo la corrispondenza

Come posso ottenere il numero di fotogrammi in un video sulla riga di comando di Linux?