¿Cómo reemplazar el contenido de una columna específica con awk?

31

Dado: hay 40 columnas en un registro. Quiero reemplazar la columna 35 para que la columna 35 se reemplace con el contenido de la columna 35 y un símbolo "$". Lo que vino a mi mente es algo como:

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

Funciona pero porque no es factible cuando el número de columna es tan grande como 10k. Necesito una mejor manera de hacer esto.

Marcus Thornton
fuente

Respuestas:

35

Puedes hacer así:

awk '$35=$35"$"'
Cuonglm
fuente
8

Probablemente hay formas más eficientes de hacer esto. Con esa advertencia:

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

Si el delimitador de campo es <space>:

sed 's/  */$&/35'
mikeserv
fuente
Si se desconoce el delimitador de campo:sed 's/./$&/35'
Inverso
@Underverse: no creo que sea lo mismo. Eso debería anteponer el carácter 35 en una línea de entrada con el carácter $delimitado o no. Lo anterior debe fijar la aparición número 35 de cualquier número de caracteres delimitadores, en otras palabras, el campo número 35, con el carácter $, sin importar la cantidad de caracteres en cada campo.
mikeserv
Ah, "40 columnas en un registro". Leí 'la columna 35' como literalmente 'la columna de 35 caracteres del archivo de texto'.
Underverse
3

Para reservar el Field-Seprator original, hice esto. La columna que quería dejar en blanco era el número $ 12.

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

Con gawk -i, si lo tiene, puede editar el archivo en su lugar.

zee
fuente
1

Tenía problemas al usar las respuestas "aprobadas", reemplazaría más que la primera columna del archivo. Yo uso este comando genérico:

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

Dónde:

  • [column] = columna que desea cambiar comenzando con 1 (no 0)
  • [replace] = texto que desea reemplazar
Jason G
fuente
awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... reemplazó un millón de marcas de tiempo en unos segundos !! :)
roblogic