GNU/Linux >> Linux Esercitazione >  >> Linux

Come aggiungere qualche simbolo (o semplicemente aggiungere una nuova riga) se i numeri nel testo non sono continui

Utilizzando grep o sed per farlo non sarebbe raccomandato come grep non può contare e sed è davvero difficile per fare qualsiasi tipo di aritmetica (dovrebbe essere un conteggio basato su espressioni regolari, un non-starter per la maggior parte delle persone tranne che per i dedicati).

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

Il awk code presuppone che 0 dovrebbe essere il primo numero, quindi mantiene il ricercato numero di riga per la riga corrente nella variabile nr . Se dall'input viene letto un numero che richiede l'inserimento di una o più righe, ciò viene fatto dal while loop (che incrementa anche il valore nr variabile).

Il numero in <...> viene analizzato specificando che < e > dovrebbero essere usati come delimitatori di campo. Il numero è quindi in $2 (il secondo campo).


Questo è probabilmente tutt'altro che efficiente...

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

Innanzitutto, utilizzo tr per ottenere due campi separati da tabulazioni dal file.

Secondo, utilizzo tr di nuovo per sostituire '>' con uno spazio, altrimenti il ​​mio comando awk fallirà :-/

I professionisti imbarazzanti qui intorno probabilmente rideranno ora :-)

Terzo, il awk -command confronterà il numero di righe elaborate con il secondo campo. Se il numero di righe è inferiore, stamperà il marcatore e aumenterà shift che viene aggiunto al numero di righe nel confronto precedente.

Quarto e quinto:sto annullando le modifiche apportate in precedenza con tr .

Ho tratto ispirazione da https://unix.stackexchange.com/a/190707/364705


Non sono un awk ragazzo, ma anche questo sembra farlo. Sono sempre aperto ai miglioramenti:

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

Inizialmente impostiamo il separatore di campo in modo che corrisponda ai caratteri < e > , quindi ogni riga è divisa in corrispondenza di questi caratteri. Ad esempio, la prima riga verrebbe assegnata a $1=A e $2=0 .

Quindi impostiamo la variabile num=0 . Lo usiamo come contatore di riga:Se il numero della riga corrente $2 è maggiore del contatore di righe, stampa ---- , incrementa la ripetizione del contatore finché entrambi i valori non sono uguali. Quindi stampa $1<$2> e incrementa il contatore.


Linux
  1. Come inserire del testo all'inizio di ogni riga in Vim

  2. Come aggiungere una nuova riga alla fine di un file?

  3. Come aggiungere un'applicazione a Gnome Window Manager?

  4. Il pacchetto che ho appena installato è legittimo e, in caso contrario, come disinstallarlo?

  5. Qual è il simbolo Newline nella Ps1 di Zsh?

Come aggiungere testo all'inizio del file in Linux

Come aggiungere un'applicazione al Dock nel sistema operativo elementare

Come aggiungere un bordo attorno al testo in GIMP

Come installare l'ultima versione di nano text editor

Come aggiungere un segnalibro in Nautilus Folder Explorer?

Come eliminare il testo selezionato nell'editor vi