0
votes

Modifier la ligne non unique dans le fichier avec SED / AWK

Je veux remplacer une ligne dans un fichier à l'aide d'outils Bash comme SED ou AWK. La partie qui rend cela difficile est que la ligne n'est pas unique, alors comment puis-je correspondre?

Je suis sûr que le match par lui-même pourrait être fait d'autre manière, mais je ne connais que la commande suivante pour remplacer les lignes: xxx

Les profils.txt ressemble à : xxx

Comment puis-je trouver le Âge: ligne pour une personne spécifique et la mise à jour? Les champs de chaque personne peuvent être dans n'importe quel ordre et les gens peuvent aussi. Les gens auront toujours les deux champs, ils sont juste en blanc si inconnu.


0 commentaires

3 Réponses :


4
votes

Vous pouvez le faire comme ceci dans awk pour définir l'âge de Bob xxx

Il trouvera Bob < / Code> et définir f sur true. Le si f est vrai et Âge est trouvé, ajoutez l'âge et la réinitialisation f


5 commentaires

Théoriquement string bob peut être n'importe où i.e. une partie d'un autre nom I.e. Bobby ou même une valeur. De plus, Âge: peut déjà avoir une valeur, pas nécessairement une valeur vide.


@anubhava true, en fonction de l'entrée OP. Le nom peut être corrigé à certains comme ce / ^ bob: $ / de son pour correspondre exactement.


@Jotne: Si BOB n'a pas d'âge, mais un Alice a un champ d'âge, votre programme définirait alors l'âge d'Alice. Vous devez réinitialiser f pour chaque ligne commencée par un nom qui est pas Bob.


@ user1934428 Ce serait une hypothèse que OP pourrait donner plus d'informations sur. Mais comme il y a des champs vides égaux, je suppose que tout est égal. Dans le même temps, pourquoi Bob: pas un champ de champ d'Alice? En raison de l'onglet devant les champs? Ce serait également une hypothèse.


Je l'ai modifié pour utiliser / ^ bob: $ / et cela a fonctionné. En outre, dans mon cas, il n'y aura pas d'étudiants sans le champ d'âge que si le fichier n'est corrompu.



4
votes

Vous pouvez utiliser ce awk (en supposant que vous souhaitez modifier Âge pour la personne BOB ): xxx < p> xxx


2 commentaires

"Joebob" correspondrait à "Bob".


Merci @denniswilliamson, il est corrigé dans le script.



1
votes

Un SED simpliste code> SCRID:

$: update bob age 14
$: cat profiles.txt
ALICE:
    AGE:
    GRADE: 70
BOB:
    GRADE:
    AGE: 14


2 commentaires

/ ^ $ étudiant: /, / ^ \ s / {...} indique uniquement le code dans le bloc Curly entre les lignes commençant par le nom majuscule de Srudent donné dans la colonne la plus à gauche et tout autre personne non blanche dans la colonne la plus à gauche. C'est une application de blocs sensible.


Il semble que cette solution ne fonctionne pas pour le dernier bloc du fichier, mais je n'ai pas testé cela. Dans mon cas particulier, il y a une "..." à la fin du fichier et les entrées sont ajoutées au-dessus de celle-ci. Votre solution fonctionne parfaitement. Les accessoires pour l'avoir écrit dans le fichier et être une doublure. ;)