GNU/Linux >> Tutoriels Linux >  >> Linux

Insérer de nouvelles lignes avec des valeurs manquantes (na) ?

Je voudrais insérer de nouvelles lignes dans les fichiers texte s'il manque des valeurs.
J'ai par exemple le fichier texte suivant (A.txt), pour lequel la ligne 5 est manquante. De plus, comme le fichier devrait avoir 12 lignes, les lignes 11-12 sont également manquantes.

1 2.30
2 3.01
3 3.22
4 3.34
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02

Ma sortie attendue est la suivante. Pour les cas manquants, une ligne doit être ajoutée avec le numéro et NA. Comme vous le voyez, cela s'est passé comme souhaité aux lignes 5, 11 et 12 :

1 2.30
2 3.01
3 3.22
4 3.34
5 NA
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02
11 NA
12 NA

Je peux le faire en utilisant le script suivant :

f1=/my-directory/
echo "new file" > "$f1"/newfile.txt  

for i in {1..12}; do
l=$(awk '{print $1}' /"$f1"/A.txt | grep -wE ^$i /"$f1"/A.txt)
if grep --quiet -wE ^$i /"$f1"/A.txt; then echo "$l" >> "$f1"/newfile.txt; else echo "$i NA" >> "$f1"/newfile.txt; fi

done

Cela fonctionne bien. Le problème est cependant que je dois le faire pour environ 600 fichiers contenant plus de 160 000 lignes environ. La solution en boucle prendrait donc trop de temps à chercher dans toutes les lignes. Ma question est :existe-t-il une solution plus simple qui pourrait faire cela ?

Réponse acceptée :

Vous pouvez le faire avec un awk script :

awk '{ while (NR + shift < $1) { print (NR + shift) " NA"; shift++ }; print } END { shift++; while (NR + shift < 13) { print (NR + shift) " NA"; shift++ } }' /tmp/test1

produira la sortie requise pour /tmp/test1 (remplacez-le par chaque fichier que vous souhaitez traiter).

Sous une forme plus lisible :

#!/usr/bin/awk -f
{
    while (NR + shift < $1) {
        print (NR + shift) " NA"
        shift++
    }
    print
}
END {
    shift++
    while (NR + shift < 13) {
        print (NR + shift) " NA"
        shift++
    }
}

Enregistrez ceci en tant que fichier, dites fill-missing , rendez-le exécutable, puis vous pouvez simplement exécuter

./fill-missing /tmp/test1

Le script traite chaque ligne, en gardant une trace du delta attendu avec le numéro de ligne actuel dans shift . Ainsi, pour chaque ligne, si la ligne actuelle ajustée ne correspond pas au premier numéro de la ligne, elle imprime le numéro de ligne approprié suivi de NA et incrémente le delta ; une fois que les numéros de ligne correspondent, il imprime la ligne actuelle. À la fin du processus, il imprime les lignes manquantes nécessaires pour atteindre 12.

Connexe :Expiration du délai dans un script shell ?
Linux
  1. Enumérer un nouveau réseau avec Nmap

  2. Remplacer la plage de lignes par la plage de lignes (sed ou autres) ?

  3. Avec la commande "cat" de Linux, comment afficher uniquement certaines lignes par numéro ?

  4. Remplacer les lignes correspondant à un motif par des lignes d'un autre fichier dans l'ordre ?

  5. Insertion Sed sur Osx sur une certaine ligne ?

Comment supprimer une ligne dans Vim sous Linux

Dupliquer, avec quelques petites modifications, quelques lignes dans un fichier texte ?

Tutoriel Unix Sed :ajouter, insérer, remplacer et compter les lignes de fichiers

Comment insérer une nouvelle ligne dans l'e-mail à l'aide de la commande linux mail ?

Comment insérer une nouvelle ligne dans le script shell Linux ?

remplacer les lignes d'un fichier par les lignes d'un autre par numéro de ligne