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.