Sto cercando di stampare la riga abbinata e la 4a riga dalla riga abbinata (riga contenente l'espressione che sto cercando).
Ho utilizzato il seguente codice:sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
Ma questo stampa solo la linea abbinata.
Viene stampata solo la 4a riga.awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
Devo stampare solo la riga corrispondente e la 4a riga.
Risposta accettata:
In awk, lo faresti come segue
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
o
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Spiegazione
La prima soluzione trova tutte le righe che corrispondono a pattern
. Quando trova una corrispondenza, memorizza il numero del record (NR
) nell'array nr
. Memorizza anche il 4° record da NR
nella stessa matrice. Questo viene fatto dal nr[NR+4]
. Ogni record (NR
) viene quindi verificato per vedere se è presente nel nr
array, in tal caso il record viene stampato.
La seconda soluzione funziona essenzialmente allo stesso modo, tranne quando incontra il pattern
stampa quella riga e quindi memorizza il 4° record prima di esso nell'array nr
, quindi passa al record successivo. Quindi quando awk
incontra questo 4° record il NR in nr
il blocco verrà eseguito e successivamente verrà stampato questo record +4.
Esempio
Ecco un file di dati di esempio, sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Utilizzando la prima soluzione:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Utilizzando la 2a soluzione:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14