¿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.

Respuestas:



8

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

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

3

Si el delimitador de campo es <space>:

sed 's/  */$&/35'

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.


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

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... reemplazó un millón de marcas de tiempo en unos segundos !! :)
— roblogic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.