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 NRstesso array. Questo è fatto dal nr[NR+4]. Ogni record ( NR) viene quindi verificato per vedere se è presente nrnell'array, in tal caso il record viene stampato.
La seconda soluzione funziona essenzialmente allo stesso modo, tranne quando incontra la patternriga stampata, quindi memorizza il 4 ° record davanti ad essa nell'array nr, quindi passa al record successivo. Quindi quando awkincontra questo 4 ° record, il NR in nrblocco 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