Acrescentar uma variável a linhas diferentes de um arquivo no bash [duplicado]

2

Digamos que eu tenha um arquivo com o seguinte texto.

E o arquivo de origem que estou lendo é assim:

#0  abc 2016-08-06 01:12:57 AM  9.1%    779.9M of 1G    156.3M of 1G
#1  abc 2016-08-06 02:33:47 AM  12.1%   339.9M of 1G    126.3M of 1G

O seguinte é o script que estou usando

#!/bin/bash

opFile="opfile.txt"
sourceFile="TestOutput"

    if [[ ! -e "$opFile" ]]
    then
    {
        touch $opFile
        count=0
        grep "#" "$sourceFile" | while read -r line ; do
        {
            cpu=$(grep "#$count" "$sourceFile" | cut -f 4 | cut -d% -f1)
            mem=$(grep "#$count" "$sourceFile" | cut -f 5 | cut -dM -f1)
            disk=$(grep "#$count" "$sourceFile" | cut -f 6 | cut -dM -f1)
            echo -e "$cpu\n$mem\n$disk" >> "$opFile"
            ((count++))
        }   
        done

    }
    else
    {
        count=0
        lineCounter=0
        grep "#" "$sourceFile" | while read -r line ; do
        {
            cpu=$(grep "#$count" "$sourceFile" | cut -f 4 | cut -d% -f1)
            mem=$(grep "#$count" "$sourceFile" | cut -f 5 | cut -dM -f1)
            disk=$(grep "#$count" "$sourceFile" | cut -f 6 | cut -dM -f1)
            ((lineCounter++))
            sed ""$lineCounter"s/$/,"$cpu"/" "$opFile" | tee "$opFile"
            ((lineCounter++))
            sed ""$lineCounter"s/$/,"$mem"/" "$opFile" | tee "$opFile" 
            ((lineCounter++))
            sed ""$lineCounter"s/$/,"$disk"/" "$opFile" | tee "$opFile" 
            ((count++))

        }
        done
    }
    fi

Agora, o script precisa ser executado várias vezes nesse $ sourceFile, pois os números nesse arquivo continuariam mudando. Então, a primeira vez que o script é executado, a saída é tão

9.1
779.9
156.3
12.1
339.9
126.3

E na segunda vez que é executado (assumindo que os valores são os mesmos no arquivo de origem), a saída deve ser semelhante.

9.1,9.1
779.9,779.9
156.3,156.3
12.1,12.1
339.9,339.9
126.3,126.3

Agora, a linha sed que usei está correta, tenho certeza, mas estou com problemas quando se trata de colocar isso no arquivo. Eu poderia ter usado o > > redirecionador de saída, mas está imprimindo tudo em uma nova linha. Tee está trabalhando um pouco inesperadamente, às vezes fazendo a coisa certa, outras vezes, meu opfile.txt está vazio. Alguma idéia de como colocar minha saída sed no arquivo corretamente? E não, de preferência, eu não quero nada exibido no stdout.

Obrigado!

    
por Izy- 28.08.2016 / 13:58

1 resposta

0

O que estava errado foi que eu estava tentando escrever no mesmo arquivo que eu estava lendo. Então, quando você usa > para escrever em um arquivo, quando o arquivo é aberto, ele é truncado antes que o sed possa colocar o conteúdo nele e, portanto, o arquivo vazio (é o que eu acho, corrija-me se estiver errado). Similar deve ter sido a lógica de por que tee trabalhou tão unexpec (tee) dly.

Por fim, um trabalho sugerido por um amigo stackoverflow resolveu de maneira muito mais fácil.

paste -d, output.txt <(grep -oP '[0-9.]+(?=%)|[0-9.]+(?=[A-Z]+ of)' source.txt) > tmp ; mv tmp output.txt

Então, para evitar que esse tipo de problema de leitura suja ocorra, um arquivo temporário foi usado. Obrigado pela sua ajuda a todos.

    
por 29.08.2016 / 18:53