Reemplace todos los valores en una columna a 1


8

Tengo varios archivos de texto que contienen 12 líneas y 3 columnas.

Ejemplo:

2       6    0.74  
42      6    0.58  
80      6    0  
112     6    0.24  
132     6    1  
216     6    0.7  
342     6    0  
390     6    0.21  
432     6    0.56  
466     6    0.75  
524     6    0.6  
646     6    0.9 

Quiero establecer todos los valores de la tercera columna en 1 en todas las líneas.

La salida debería verse así:

2    6   1  
42   6   1  
80   6   1  
112  6   1  
132  6   1  
216  6   1  
342  6   1  
390  6   1  
432  6   1  
466  6   1  
524  6   1  
646  6   1  

¿Alguien sabe un comando que pueda resolver este problema?

Respuestas:


16
awk '{print $1, $2, "1"}' inputfile

1
Este comando imprime la primera línea del archivo de texto correctamente en la terminal, pero no realiza cambios en el archivo ...
user203269

redirigir la salida a otro archivoawk '{print $1, $2, "1"}' inputfile > newfile
user1700494

¡Gracias! Funciona pero solo escribe la primera línea, columnas 1, 2 y 3. Me gustaría escribir las 12 líneas de la misma manera :)
user203269

12

tratar

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 establecerá el tercer campo en 1

sed (aquí GNU u busybox sedcon su -iopción para la edición in situ)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$es una secuencia de 0a 9y .hasta el final de la línea.

sed (golfed 4 bytes)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ cualquier carácter que no sea espacio, hasta el final de la línea.

3
Vamos a codegolf:: sed 's/[^ ]*$/1/'->
Ipor Sircer

Muchas gracias! :) El awk parece funcionar, excepto por la primera línea: 2 6 1 6 1 80 6 1 112 6 1 132 6 1 216 6 1 342 6 1 390 6 1 432 6 1 466 6 1 524 6 1 646 6 1 El primera línea imprime el segundo y tercer valor dos veces?
user203269

@ user203269 la versión awk funciona bien para mí (aunque con un problema de
formateo

3
awkgolf: awk \$3=1(POSIX pero no funcionaría con el awk de los años 70 como se encuentra en / bin en Solaris)
Stéphane Chazelas

que awkla solución es realmente genial .... se puede explicar pls
mazs

5

Las líneas en su salida esperada parecen terminar en dos caracteres de espacio y tienen campos separados por una pestaña y un carácter de espacio.

Si eso es lo que quieres, entonces necesitarías:

awk -v 'OFS=\t ' '$3="1  "' < infile > outfile

O con sed:

tab=$(printf '\t')
sed "
  s/[[:blank:]]\{1,\}/$tab /g
  s/[^[:blank:]]\{1,\}[[:blank:]]*$/1  /
  s/^[[:blank:]]*//" < infile > outfile

¿Por qué los espacios después de 1?
123

@ 123, como dije, en la salida esperada del OP, cada línea termina en dos caracteres de espacio.
Stéphane Chazelas

Una lectura errónea pensó que dijiste que los campos estaban separados por dos espacios y una pestaña. culpa mía.
123

Hola Stephane, awk Esto hace los tres primeros valores correctamente, entonces se borra la línea column1 2 y sigue sin hacer cambios ..
user203269

1
@ user203269, primero convierta su archivo de MS-DOS a Unix.
Stéphane Chazelas

3

Simplemente con GNU sed, usando -ipara reemplazar el texto directamente en el archivo:

sed -i 's:\(.*\s\)\(.*\s\)\(.*\):\1\21:g' textfile

Las columnas se corresponden con los grupos de expresiones regulares en el paréntesis, la reutilización de ellos con \1y \2y luego con un "1" para reemplazar el último grupo.

En este caso de uso, la solución propuesta usando también awkes agradable y corta.


2

esto hará el trabajo:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'

cat file.txt | cortar -d '' -f-2 | sed 's / $ / 1 /' 646 6 0.5 1 imprime una línea (la última línea) en el terminal, pero no cambia el archivo.txt ...
user203269

-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename

¿Podrías editar tu publicación para incluir más contexto sobre por qué crees que esta es la solución?
kemotep
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.