Snažím se vytisknout odpovídající řádek a 4. řádek ze shodného řádku (řádek obsahující výraz, který hledám).
Používal jsem následující kód:sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
Tím se však vytiskne pouze odpovídající řádek.
Tím se vytiskne pouze 4. řádek.awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
Potřebuji vytisknout pouze odpovídající řádek a pouze 4. řádek.
Přijatá odpověď:
V awk byste to udělali následovně
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
nebo
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Vysvětlení
První řešení najde všechny řádky, které odpovídají pattern
. Když najde shodu, uloží číslo záznamu (NR
) v poli nr
. Ukládá také 4. záznam z NR
ve stejném poli. To se provádí pomocí nr[NR+4]
. Každý záznam (NR
) se poté zkontroluje, zda je přítomen v nr
pole, pokud ano, záznam se vytiskne.
Druhé řešení funguje v podstatě stejně, kromě případů, kdy narazí na pattern
vytiskne tento řádek a poté uloží 4. záznam před ním do pole nr
, pak přejde na další záznam. Když pak awk
narazí na tento 4. záznam NR in nr
blok se provede a vytiskne tento záznam +4 poté.
Příklad
Zde je příklad datového souboru sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Použití 1. řešení:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Použití 2. řešení:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14