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?

usuario203269
fuente

Respuestas:

16
awk '{print $1, $2, "1"}' inputfile
usuario1700494
fuente
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.
Archemar
fuente
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
Stéphane Chazelas
fuente
¿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.

mazs
fuente
2

esto hará el trabajo:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
Wissam Roujoulah
fuente
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
Novela de suspenso
fuente
¿Podrías editar tu publicación para incluir más contexto sobre por qué crees que esta es la solución?
kemotep