GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So fügen Sie ein Symbol hinzu (oder fügen Sie einfach einen Zeilenumbruch hinzu), wenn die Zahlen im Text nicht fortlaufend sind

Mit grep oder sed dafür wird grep nicht empfohlen kann nicht zählen und sed ist wirklich schwierig um irgendeine Art von Arithmetik zu machen (es müsste ein auf regulären Ausdrücken basierendes Zählen sein, ein Nichtstarter für die meisten Leute, außer für die Engagierten).

$ 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>

Die awk Code geht davon aus, dass 0 sollte die erste Zahl sein, und behält dann die gesuchte bei Zeilennummer für die aktuelle Zeile in der Variablen nr . Wird aus der Eingabe eine Zahl gelesen, die das Einfügen einer oder mehrerer Zeilen erfordert, übernimmt dies der while Schleife (die auch nr erhöht Variable).

Die Zahl in <...> wird geparst, indem < angegeben wird und > sollten als Feldbegrenzer verwendet werden. Die Nummer steht dann in $2 (das 2. Feld).


Das ist wahrscheinlich alles andere als effizient...

$ 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>

Zuerst verwende ich tr um zwei tabulatorgetrennte Felder aus der Datei zu erhalten.

Zweitens verwende ich tr wieder, um '>' durch ein Leerzeichen zu ersetzen, da sonst mein awk-Befehl fehlschlägt :-/

Die awk-Profis hier werden jetzt wahrscheinlich lachen :-)

Drittens die awk -Befehl vergleicht die Anzahl der verarbeiteten Zeilen mit dem zweiten Feld. Wenn die Anzahl der Zeilen kleiner ist, wird die Markierung gedruckt und shift erhöht die zur Anzahl der Zeilen im vorherigen Vergleich hinzuaddiert wird.

Viertens und fünftens:Ich mache die Änderungen rückgängig, die ich zuvor mit tr vorgenommen habe .

Ich habe mich von https://unix.stackexchange.com/a/190707/364705

inspirieren lassen

Ich bin kein awk Kerl, aber das scheint es auch zu tun. Ich bin immer offen für Verbesserungen:

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

Als erstes setzen wir das Feldtrennzeichen auf die Zeichen < und > , also wird jede Zeile an diesen Zeichen geteilt. Zum Beispiel würde die erste Zeile $1=A zugewiesen werden und $2=0 .

Dann setzen wir die Variable num=0 . Wir verwenden ihn als Zeilenzähler:Ist die Nummer der aktuellen Zeile $2 größer als der Zeilenzähler ist, geben Sie ---- aus , erhöhen Sie den Zähler wiederholen, bis beide Werte gleich sind. Drucken Sie dann $1<$2> und erhöhen Sie den Zähler.


Linux
  1. Wie füge ich eine Anwendung zum Gnome Window Manager hinzu?

  2. Ist das Paket, das ich gerade installiert habe, legitim, und wenn nicht, wie kann ich es deinstallieren?

  3. Was ist das Newline-Symbol in Zshs Ps1?

  4. Warum werden einige von Nmap gemeldete Ports gefiltert und die anderen nicht?

  5. Addieren Sie eine Spalte mit Zahlen in der Unix-Shell

So fügen Sie Text am Anfang einer Datei in Linux hinzu

So fügen Sie eine Anwendung zum Dock in einem elementaren Betriebssystem hinzu

So fügen Sie in GIMP einen Rahmen um Text hinzu

So installieren Sie die neueste Version des Nano-Texteditors

Wie füge ich ein Lesezeichen im Nautilus-Ordner-Explorer hinzu?

So löschen Sie ausgewählten Text im vi-Editor