GNU/Linux >> Tutoriels Linux >  >> Linux

Comment ajouter un symbole (ou simplement ajouter une nouvelle ligne) si les nombres dans le texte ne sont pas continus

Utilisation de grep ou sed pour faire cela ne serait pas recommandé comme grep ne sait pas compter et sed est vraiment difficile pour faire n'importe quel type d'arithmétique (cela devrait être un comptage basé sur des expressions régulières, un non-démarrage pour la plupart des gens sauf pour les dédiés).

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

Le awk code suppose que 0 devrait être le premier nombre, puis maintient le recherché numéro de ligne de la ligne courante dans la variable nr . Si un nombre est lu à partir de l'entrée nécessitant l'insertion d'une ou plusieurs lignes, cela est fait par le while boucle (qui incrémente également le nr variable).

Le nombre en <...> est analysé en spécifiant que < et > doivent être utilisés comme délimiteurs de champ. Le numéro est alors en $2 (le 2ème champ).


C'est probablement loin d'être efficace...

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

Tout d'abord, j'utilise tr pour obtenir deux champs séparés par des tabulations du fichier.

Deuxièmement, j'utilise tr à nouveau pour remplacer '>' par un espace, car sinon ma commande awk échouera :-/

Les awk-professionnels ici vont probablement rire maintenant :-)

Troisièmement, le awk -command comparera le nombre de lignes traitées au deuxième champ. Si le nombre de lignes est plus petit, il imprimera le marqueur et augmentera shift qui s'ajoute au nombre de lignes de la comparaison précédente.

Quatrième et cinquième :j'annule les modifications que j'ai apportées précédemment avec tr .

Je me suis inspiré de https://unix.stackexchange.com/a/190707/364705


Je ne suis pas un awk gars, mais cela semble aussi le faire. Je suis toujours ouvert aux améliorations :

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

Au début, nous définissons le séparateur de champs pour qu'il corresponde aux caractères < et > , donc chaque ligne est divisée au niveau de ces caractères. Par exemple, la première ligne serait affectée à $1=A et $2=0 .

Ensuite, nous définissons la variable num=0 . Nous l'utilisons comme compteur de ligne :Si le numéro de la ligne courante $2 est supérieur au compteur de lignes, écrivez ---- , incrémentez la répétition du compteur jusqu'à ce que les deux valeurs soient égales. Puis imprimez $1<$2> et incrémenter le compteur.


Linux
  1. Comment ajouter une nouvelle ligne à la fin d'un fichier ?

  2. Comment ajouter une application au gestionnaire de fenêtres Gnome ?

  3. Le package que je viens d'installer est-il légitime, et si ce n'est pas le cas, comment le désinstaller ?

  4. Pourquoi certains ports signalés par Nmap sont-ils filtrés et pas les autres ?

  5. Ajouter une colonne de nombres au shell Unix

Comment ajouter du texte au début du fichier sous Linux

Comment ajouter une application au Dock dans un système d'exploitation élémentaire

Comment ajouter une bordure autour du texte dans GIMP

Comment installer la dernière version de l'éditeur de texte nano

Comment ajouter un signet dans l'explorateur de dossiers Nautilus ?

Comment supprimer le texte sélectionné dans l'éditeur vi