GNU/Linux >> Znalost Linux >  >> Linux

Tisknout odpovídající čáru a N-tou čáru ze shodné čáry?

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

Linux
  1. Najděte verzi WordPress z příkazového řádku

  2. Jak mohu přimět grep, aby vytiskl řádky pod a nad každým odpovídajícím řádkem?

  3. Vytiskněte poslední řádek souboru z CLI

  1. Nakonfigurujte pracovní prostor Linuxu vzdáleně z příkazového řádku

  2. Hlášení I/O z příkazového řádku Linuxu

  3. Jak získám svou IP adresu z příkazového řádku?

  1. Manipulace s úchopy kláves a ukazatelů X na příkazovém řádku?

  2. Jak restartovat Icewm z příkazového řádku?

  3. Ponechat pouze první řádek z každé sekvence po sobě jdoucích řádků, které odpovídají vzoru?