GNU/Linux >> Znalost Linux >  >> Linux

Jak přidat nějaký symbol (nebo jen přidat nový řádek), pokud čísla v textu nejsou souvislá

Pomocí grep nebo sed pro provedení tohoto by se nedoporučuje jako grep neumím počítat a sed je opravdu obtížné dělat v něm jakýkoli druh aritmetiky (muselo by to být počítání založené na regulárních výrazech, což je pro většinu lidí s výjimkou těch, kteří jsou na to specializovaní, nepostradatelný).

$ awk -F '[<>]' '{ while ($2 >= ++nr) print "---"; print }' file
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
---
A_D2<6>
---
---
A<9>
A_D2<10>
---
---
A<13>

awk kód předpokládá, že 0 by mělo být první číslo a poté zachovává požadované číslo řádku pro aktuální řádek v proměnné nr . Pokud je ze vstupu načteno číslo, které vyžaduje vložení jednoho nebo několika řádků, provede se to pomocí while smyčka (která také zvyšuje nr proměnná).

Číslo v <...> je analyzován zadáním < a > by měly být použity jako oddělovače polí. Číslo je pak v $2 (2. pole).


To je pravděpodobně daleko od účinnosti...

$ tr '<' '\t' < testfile | tr '>' ' ' \
  | awk '{ while (NR + shift <= $2) { print "-----"; shift++ }; print }' \
  | tr '\t' '<' \
  | tr ' ' '>'
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>

Nejprve používám tr získat dvě pole oddělená tabulátory ze souboru.

Za druhé, používám tr znovu nahradit '>' mezerou, protože jinak můj příkaz awk selže :-/

Zdejší nešikovní profesionálové se teď pravděpodobně budou smát :-)

Za třetí, awk -command porovná počet zpracovaných řádků s druhým polem. Pokud je počet řádků menší, vytiskne značku a zvýší shift který se přičte k počtu řádků v předchozím srovnání.

Za čtvrté a za páté:Vracím zpět změny, které jsem dříve provedl pomocí tr .

Nějakou inspiraci jsem získal z https://unix.stackexchange.com/a/190707/364705


Nejsem awk chlape, ale zdá se, že to také dělá. Jsem vždy otevřený vylepšením:

awk -F '[<>]' -v num=0 '
{
  while(num < $2) {
    print "----";
    num++
  }
  print $1"<"$2">"
  num++
}' file

Nejprve nastavíme oddělovač polí tak, aby odpovídal znakům < a > , takže každý řádek je rozdělen na tyto znaky. Například první řádek bude přiřazen k $1=A a $2=0 .

Poté nastavíme proměnnou num=0 . Používáme jej jako počítadlo řádků:If číslo aktuálního řádku $2 je větší než počítadlo řádků, vytiskněte ---- , zvyšujte opakování čítače, dokud nebudou obě hodnoty stejné. Poté vytiskněte $1<$2> a zvýšit počítadlo.


Linux
  1. Jak přidat nový řádek na konec souboru?

  2. Jak přidat aplikaci do správce oken Gnome?

  3. Jaký je symbol nového řádku v Zsh Ps1?

  1. Jak přidat čísla řádků do textových souborů v systému Linux

  2. Jak vytisknout pouze hex hodnoty z hexdump bez čísel řádků nebo tabulky ASCII?

  3. Jak získat MAC adresy zařízení, která nejsou v síti

  1. Jak vložit text na začátek každého řádku ve Vimu

  2. Je balíček, který jsem právě nainstaloval, legitimní, a pokud ne, jak jej odinstalovat?

  3. Proč jsou některé porty hlášeny Nmapem filtrovány a ostatní ne?