Remplacer des caractères dans une chaîne de caractères à l'aide de awk ou sed
Compte tenu de la série ci-dessous, comment puis-je remplacer la 6ème et la 7ème en obtenant les 14 et 15 chiffres à l'aide de awk ou sed.
xxxxx02xxxxxx89xx
xxxxx22xxxxxx33xx
sortie
xxxxx89xxxxxx89xx
xxxxx33xxxxxx33xx
Je suis novice ici, désolé pour ma question.
Vous devez vous connecter pour publier un commentaire.
La commande sed est simple, mais difficile à lire:
Un peut-être plus facile à gérer solution peut être eu avec Gnu
awk
(mais pas les autres awk variétés. Voir cependant ci-dessous.):La
FIELDWIDTHS
variable définit 5 de largeur fixe champs: le premier 5 caractères, les deux caractères (positions 6 et 7); les six caractères (8 à 13); les deux caractères suivants (14 et 15); et dans l'autre (jusqu'à) 999 caractères, ce qui devrait être le reste de la ligne. (Si vous avez plus de lignes, d'augmenter, si nécessaire). RéglageOFS
à vide est souvent utile avec des champs de longueur fixe; il empêcheawk
d'insérer des espaces entre les champs de sortie.FIELDWIDTHS
est une distribution GNU awk extension. Cependant, il est assez facile à reproduire dans Posixawk
. Voici une mise en œuvre simple:Autant que je sache, seulement Gnu awk vous permet de mixer des fichiers de programme et du programme de texte sur la
awk
de ligne de commande. Posix nécessite la-f program-file
option, qui peut être répété, mais ne requiert pas l'-e program-text
option tel que mis en œuvre par Gnu awk. Par conséquent, si vous souhaitez utiliser l'extrait ci-dessus avec une ligne de commande awk programme, vous avez besoin de faire quelque chose comme ceci:(En supposant que vous vous placez le fieldwidth extrait dans
fw.awk
.)Pour plus d'efficacité,
fw.awk
insiste sur le fait que vous dites que vous avez changéFIELDWIDTHS
en appelantfieldwidth_set()
. Ou vous pouvez utiliserset_fieldwidth("....")
pour définirFIELDWIDTHS
à une nouvelle valeur. Il travaillera avec GNU awk ainsi qu'avec d'autres awk implémentations; il vous permet de GNU awk faire le gros du travail.($2=$4)||1
au lieu de{$2=$4}1
?'$2=$4'
échouera si l'entrée est0
($2=$4)||1
et le consensus était qu'elle code le code car il est en train de mettre une action (l'affectation) dans l'état partie, mais l'ajout d'une deuxième condition (||1
) à force de awk ignorer le résultat de la cession et n'a pas d'avantages vs{$2=$4}1
.{$2=$4;print}
. Je vais le modifier un peu.1
l'emporte sur le plus de clarté deprint
dans un petit script car il conduit à la maison plusieurs awk fondamentaux simultanément: 1) qu'un script awk, c'est de faire de<condition>{<action>}
états, et 2) que la valeur par défaut<action>
est d'imprimer l'enregistrement en cours. Tout le monde a BESOIN de connaître à la fois de ceux à utiliser awk efficacement donc, soit ils le font déjà et le sens de l'1
est évident, soit ils ne le sont pas et d'avoir à apprendre ce1
ne leur enseigne.{$2=$4}1
? Qu'il enregistre cinq caractères c'est un avantage pour les golfeurs.mawk
, qui n'a pas un grand optimiseur, mais ne fournissent un mécanisme de vidage virtuel ops, montre que{$2=$4;print}
être la plus courte du programme compilé, donc c'est sans doute la manière la plus rapide (et($2=$4)||1
est la plus longue, donc je corrige la position des mains).Vous pouvez essayer de le ci-dessous sed commande,
Il remplace les 14 et 15 chiffres avec les chiffres en position 6 et 7.
Il remplace les 6 et 7 chiffres avec les chiffres dans les 14ème et 15ème.
02
sur la même ligne, alors vous devez utiliser l'indicateur global pour remplacer les deux02
's avec 89. sed et awk processus de la ligne de saisie en ligne.sed -r 's/^(.{5})(..)(.{6})../\1\2\3\2/g' file
how can I replace 6th and 7th by getting 14th and 15th digit using awk or sed.
-r
paramètre. Donc, essayezsed 's/^\(.\{5\}\)..\(.\{6\}\)\(..\)/\1\3\2\3/g' file
Cela doit suivre votre demande et de travailler avec tous les
awk
:Il va changer les chiffres en position
6
le14
et celui de7
avec un int15
Si
FS=""
ne fonctionne pas, essayez ceci:De la demande dans l'un des commentaires:
It works, thanks! How about if I want to replace 14th and 15th digit by 6th and 7th digit? – Vision111
OFS=
dans le premier exemple, ou vous pouvez utiliserFS="" OFS=""
. Essayez cela,echo "xxxxx27xxxxxx89xx" | awk '{$6=$14;$7=$15}1' FS= OFS=
. Vous pouvez également essayer cetteawk 'BEGIN {FS=OFS=""} {$6=$14;$7=$15}1'
ou ceci:awk -v FS="" -v OFS="" '{$6=$14;$7=$15}1'
=
. À partir de ceecho "xxxxx27xxxxxx89xx" | awk '{$6=$14;$7=$15}1' FS= OFS=
, j'obtiens:xxxxx89xxxxxx89xx
. C'est simple, clairawk
et devrait fonctionner sur la plupart des systèmes.gawk
--compat
.FS
à rien ne fonctionne avec la version différente deawk
. Quel système d'exploitation êtes-vous?--posix
si ?FS=
EST un gawk extension. Je n'avais aucune idée... Merci.Cela va fonctionner sans GNU awk
GAWK
Ou plus long, mais plus générique
RÉSULTAT:
substr($0,0,1); substr($0,2,1)
aurait aucun sens, tout comme l'utilisation de l'indice 0 pour le 1er char, mais 14 pour la 14e char n'est pas ici.1
dans l'avenir, alors 🙂