Substitua todos os valores de 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 sabe um comando que pode resolver este problema?

    
por user203269 01.12.2016 / 10:19

6 respostas

14

awk '{print $1, $2, "1"}' inputfile
    
por 01.12.2016 / 10:24
10

tente

awk

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

sed (aqui GNU ou busybox sed com sua opção -i para edição no local)

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

sed (4 bytes)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ qualquer caractere que não seja espaço, até o final da linha.
por 01.12.2016 / 10:25
4

As linhas em sua saída esperada parecem terminar em dois caracteres de espaço e ter campos separados por uma tabulação e um caractere de espaço.

Se é realmente o que você quer, então você precisa:

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
    
por 01.12.2016 / 11:22
3

Simplesmente com o GNU sed , usando -i para substituir o texto diretamente no arquivo:

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

As colunas são correspondidas por grupos de expressões regulares nos parênteses, reutilizando-as com e e, em seguida, usando um "1" para substituir o último grupo.

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

    
por 01.12.2016 / 11:30
2

isso fará o trabalho:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
    
por 01.12.2016 / 10:30
-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename
    
por 11.04.2018 / 23:11