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.

Marcus Thornton
la source

Réponses:

35

Vous pouvez faire comme ça:

awk '$35=$35"$"'
cuonglm
la source
8

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

awk '{$35 = $35"$"; print}' infile > outfile
jasonwryan
la source
3

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

sed 's/  */$&/35'
mikeserv
la source
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.

zee
la source
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
Jason G
la source
awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... remplacé un million d'horodatages en quelques secondes !! :)
roblogic