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 linee corrispondenti pattern
. Quando trova una corrispondenza, memorizza il numero di record ( NR
) nella matrice nr
. Memorizza anche il 4 ° record dallo NR
stesso array. Questo è fatto dal nr[NR+4]
. Ogni record ( NR
) viene quindi verificato per vedere se è presente nr
nell'array, in tal caso il record viene stampato.
La seconda soluzione funziona essenzialmente allo stesso modo, tranne quando incontra la pattern
riga stampata, quindi memorizza il 4 ° record davanti ad essa nell'array nr
, quindi passa al record successivo. Quindi quando awk
incontra questo 4 ° record, il NR in nr
blocco verrà eseguito e successivamente stampa 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 seconda soluzione:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
egrep "pattern" -A4