Editar texto iterativamente dentro de um arquivo usando comandos

1

Eu sou um novo usuário do Ubuntu. Por favor, ajude-me a resolver o seguinte problema:

Meu arquivo de texto de entrada é

    -0.716425 -12.8939 -3.3341 -7.38497 -2.62709 3.00437
    -6.69861 -13.8853 -5.81095 -7.37465 -0.268193 -5.45344

Meu arquivo de texto de saída deve se parecer com

    1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437
    7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 

Eu tentei o comando sed , mas não obtive os resultados necessários.

Como devo fazer isso a partir da linha de comando?

    
por YUVRAJ 12.04.2015 / 22:31

3 respostas

2

$ cat file
-0.716425 -12.8939 -3.3341 -7.38497 -2.62709 3.00437
-6.69861 -13.8853 -5.81095 -7.37465 -0.268193 -5.45344
$ awk '{for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS;print""}' file
1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437 
7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 12:-5.45344 

Como funciona

  • for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS

    Isso faz um loop sobre cada campo em uma linha e imprime com um número prefixado. A variável n é o número. ++n incrementa n de um a cada vez que é invocado.

  • print""

    Isso imprime uma nova linha no final de cada linha.

Para atualizar o arquivo no lugar

awk '{for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS;print""}' file >file.tmp && mv file.tmp file

Ou, com as as versões mais recentes do GNU awk (4.1.0 +, no Ubuntu 14.10+ ):

gawk -i inplace '{for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS;print""}' file
    
por John1024 12.04.2015 / 22:39
0

Se você estiver usando o GNU awk (gawk), você pode fazer isso com uma divisão inteligente de registros:

awk '{ORS=RT; print NR":"$0}' RS='[ \n]+' infile

Saída:

1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437
7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 12:-5.45344
    
por Thor 12.04.2015 / 23:05
0

Que tal python :

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    prev = 0
    for line in f:
        elements = line.rstrip().split()
        for i in range(len(elements)):
            print str(prev + i + 1) + ':' + elements[i],
        print '\n'.rstrip()
        prev = len(elements)

Saída:

1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437 
7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 12:-5.45344

Se você quiser salvar a saída no mesmo arquivo, salve a saída em um arquivo temporário primeiro, remova o arquivo original e renomeie o arquivo temporário para o arquivo original.

    
por heemayl 12.04.2015 / 23:59