GNU/Linux >> Znalost Linux >  >> Linux

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

Pokud 2 nebo více po sobě jdoucích řádků obsahuje určitý vzor, ​​odstraňte všechny odpovídající řádky a ponechte si pouze první řádek.

V níže uvedeném příkladu, když 2 nebo více po sobě jdoucích řádků obsahuje „logické IO“, musíme odstranit všechny odpovídající řádky, ale ponechat první řádek.

Vstupní soubor:

select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
testing logical IO 500
handling logical IO 49
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
testing logical IO 12

Výstupní soubor:

select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346

Přijatá odpověď:

Pomocí awk :

awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt 
  • /logical IO/ {if (!seen) {print; seen=1}; next} zkontroluje, zda řádek obsahuje logical IO , pokud je nalezen, a proměnná seen je false, tj. předchozí řádek neobsahuje logical IO , vytiskněte řádek a nastavte seen=1 a přejděte na další řádek, jinak přejděte na další řádek, protože předchozí řádek má logical IO

  • Pro jakýkoli jiný řádek {print; seen=0} , vytiskne řádek a sady seen=0

Příklad:

$ cat file.txt 
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
testing logical IO 500
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
parsing logical IO 346
testing logical IO 12

$ awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt 
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346

Linux
  1. Vrátit pouze část řádku po odpovídajícím vzoru?

  2. Jak pomocí příkazu Linux „cat“ zobrazit pouze určité řádky podle čísla?

  3. Nahradit řádky odpovídající vzoru řádky z jiného souboru v pořadí?

  1. Odebrat další řádky záhlaví ze souboru, kromě prvního řádku?

  2. Najít pouze první výskyt pouze pomocí Grepu?

  3. Jak získat pouze potřebnou linku z výstupu terminálu?

  1. ^M na konci každého řádku ve vim

  2. získat prvních 5 znaků z každého řádku v shell skriptu

  3. Jak mohu získat slova mezi prvními dvěma výskyty textu/vzoru?