Substitua todos os valores em uma coluna para 1

8

Eu tenho vários arquivos de texto contendo 12 linhas e 3 colunas.

Exemplo:

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 

Eu quero definir todos os valores da terceira coluna para 1 em todas as linhas.

A saída deve ficar assim:

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  

Alguém conhece um comando que pode resolver esse problema?

user203269
fonte

Respostas:

16
awk '{print $1, $2, "1"}' inputfile
user1700494
fonte
1
Este comando imprime a primeira linha no arquivo de texto corretamente no terminal, mas não faz alterações no arquivo ...
user203269
redirecionar a saída para outro arquivoawk '{print $1, $2, "1"}' inputfile > newfile
user1700494
Obrigado! Ele funciona, mas só escreve para fora a primeira linha, coluna 1, 2 e 3. Eu gostaria de escrever todos os 12 linhas da mesma maneira :)
user203269
12

tentar

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 definirá o terceiro campo para 1

sed (aqui GNU ou busybox sedcom sua -iopção para edição no local)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$é uma sequência de 0de 9e .até ao final da linha.

sed (com 4 bytes de golfe)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ qualquer caractere que não seja o espaço até o final da linha.
Archemar
fonte
3
Vamos codegolf:: sed 's/[^ ]*$/1/'->
Ipor Sircer
Muito obrigado! :) O awk parece funcionar, exceto para a primeira linha: 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 O primeira linha imprime o 2º e o 3º valor duas vezes?
precisa saber é o seguinte
@ user203269 awk versão funciona bem para mim (embora com uma questão formatação)
Archemar
3
awkgolfed: awk \$3=1(POSIX, mas não trabalho com o awk dos anos 70 como encontrado em / bin no Solaris)
Stéphane Chazelas
que awksolução é muito legal .... você pode explicar pls
mazs
5

As linhas na saída esperada parecem terminar em dois caracteres de espaço e têm campos separados por uma guia e um caractere de espaço.

Se é isso mesmo que você deseja, precisará:

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

Ou com sed:

tab=$(printf '\t')
sed "
  s/[[:blank:]]\{1,\}/$tab /g
  s/[^[:blank:]]\{1,\}[[:blank:]]*$/1  /
  s/^[[:blank:]]*//" < infile > outfile
Stéphane Chazelas
fonte
Por que os espaços após 1?
123
@ 123, como eu disse, na saída esperada do OP, cada linha termina em dois caracteres de espaço.
Stéphane Chazelas
A leitura errada considerou que você disse que os campos estavam separados por dois espaços e uma tabulação. foi mal.
123
Oi Stephane, Este awk faz os três primeiros valores corretamente, então ele exclui linha column1 2 e continua sem fazer alterações ..
user203269
1
@ user203269, converta primeiro o seu arquivo do MS-DOS para o Unix.
Stéphane Chazelas
3

Simplesmente com o GNU sed, use -ipara substituir o texto diretamente no arquivo:

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

As colunas são acompanhadas por grupos de regex no parêntese, reutilizando-os com \1e \2em seguida, usando um "1" para substituir o último grupo.

Nesse caso de uso, a solução proposta awké boa e curta também.

mazs
fonte
2

isto fará o trabalho:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
Wissam Roujoulah
fonte
arquivo cat.txt | cut -d '' -f-2 | sed 's / $ / 1 /' 646 6 0,5 1 imprime uma linha (a última linha) no terminal, mas não altera o file.txt ...
user203269
-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename
Suspense
fonte
Você poderia editar sua postagem para incluir mais contexto sobre o motivo pelo qual você acha que essa é a solução?
Kemotep 11/04