Je suis tombé sur une question (sur SO lui-même) où OP doit faire l'opération d'édition et de sauvegarde dans Input_file (s) lui-même.
Je sais que pour un seul fichier d'entrée, nous pourrions faire ce qui suit:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Supposons maintenant que nous devons apporter des modifications dans le même type de format de fichiers (supposons .txt ici).
Ce que j'ai essayé / pensé pour ce problème: Son approche passe par une boucle for de fichiers .txt et appeler singleawk
est un processus douloureux et NON recommandé, car cela gaspillera des cycles de processeur inutiles et pour plus de fichiers, ce serait plus lent.
Donc, que pourrait-on faire ici pour effectuer une modification inplace pour plusieurs fichiers avec un NON GNU awk
qui ne prend pas en charge l'option inplace. J'ai également parcouru ce fil Enregistrer les modifications en place avec awk mais il n'y a pas grand-chose pour NON GNU awk vice et changer plusieurs fichiers en awk
lui-même, car un awk non GNU n'aura pas d' inplace
option.
REMARQUE: Pourquoi j'ajoute unebash
balise depuis, dans ma partie réponse, j'ai utilisé des commandes bash pour renommer les fichiers temporaires en leurs noms de fichier d'entrée afin de les ajouter.
EDIT: Selon le commentaire d'Ed Sir, en ajoutant un exemple d'échantillons ici, bien que le but du code de ce fil puisse également être utilisé par l'édition générique sur place.
Exemple de fichier (s) d'entrée:
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Exemple de sortie attendue:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk
, (peut-être dans un sous-shell) ou un {...}
groupe inclus, puis écrire les résultats dans le fichier de sortie souhaité (soit pour chaque fichier d'entrée, ou un fichier combiné pour tous les fichiers d'entrée). Ensuite, vous redirigez simplement la sortie du groupe sous-shell ou accolade vers le fichier en cours d'écriture? Le simple fait d'inclure une chaîne de fichiers d'entrée à la suite de la awk
commande traiterait séquentiellement tous les fichiers (ou quelque chose de similaire) ??
awk {..} file1 .. fileX
écrire le fichier modifié comme, par exemple temp01
et dans votre prochaine itération lors du traitement du fichier suivant, utilisez un mv -f tmp01 input01
pour écraser le fichier d'entrée avec les données modifiées; ou (2) il suffit d'écrire un nouveau répertoire de ./tmp/tmp01 ... ./tmp/tmp0X
pendant l'exécution du awk
script et de suivre avec une boucle sur les fichiers dans le ./tmp
répertoire et, par exemple mv -f "$i" "input_${i##*[^0-9]}"
(ou toute autre extension dont vous avez besoin pour remplacer les anciens fichiers d'entrée.
awk
l'achèvement complet du code, la deuxième option est presque la même que celle que j'utilise dans ma suggestion. soyez reconnaissant si vous pouviez faire part de vos réflexions sur cette solution, monsieur.