Comment remplacer le contenu d'une colonne spécifique par awk?


31

Étant donné: il y a 40 colonnes dans un enregistrement. Je veux remplacer la 35e colonne afin que la 35e colonne soit remplacée par le contenu de la 35e colonne et un symbole "$". Ce qui m'est venu à l'esprit est quelque chose comme:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

Cela fonctionne mais parce que c'est irréalisable lorsque le nombre de colonnes est aussi grand que 10k. J'ai besoin d'une meilleure façon de procéder.

Réponses:



8

Il existe probablement des moyens plus efficaces de procéder. Avec cette mise en garde:

awk '{$35 = $35"$"; print}' infile > outfile

3

Si le délimiteur de champ est <space>:

sed 's/  */$&/35'

Si le délimiteur de champ est inconnu:sed 's/./$&/35'
Underverse

@ Underverse - Je ne pense pas que ce soit la même chose. Cela devrait préfixer le 35e caractère sur une ligne d'entrée avec $ou non délimité par des caractères. La chose ci-dessus devrait apposer la 35ème occurrence de n'importe quel nombre de caractères de délimitation - en d'autres termes, le 35ème champ - avec le caractère $- peu importe comment les caractères sont dans chaque champ.
mikeserv

Ah, "40 colonnes dans un record". J'ai lu «la 35e colonne» comme littéralement «la 35e colonne de caractères du fichier texte».
Underverse

3

Pour réserver le Field-Seprator original, je l'ai fait. La colonne que je voulais effacer était le numéro 12 $.

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

Avec gawk -i, si vous l'avez, vous pouvez modifier le fichier en place.


1

En cas de problème avec les réponses "approuvées", cela remplacerait plus que la première colonne du fichier. J'utilise cette commande générique:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

Où:

  • [column] = colonne que vous souhaitez modifier en commençant par 1 (pas 0)
  • [replace] = texte que vous souhaitez remplacer

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... remplacé un million d'horodatages en quelques secondes !! :)
roblogic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.