Lê do text1 e escreve no text2

2

Eu sou novo em scripts de shell.

Eu gostaria de escrever um script para ler o arquivo text1 e obter um valor desse arquivo.

Este é o conteúdo do arquivo de texto:

L_T4000-Level3-Ouerdia  6679088203.600000   1523.208000
L_T4000-Level3-Ouerdiaa 8230141220.800000   1526.263200
L_T4000-nodeATI_Wardiaa 444039671.536000    4091589798.080000
L_T4000-node_TIS    6663189651.680000   2080241494.000000
L_T4000-node_TISa   6636796103.440000   2044580242.080000
L_International_node-globe  115911592756.879990 22433604426.723553
L_CRS_X-node06788   4801933455.200000   1329.232178
L_CRS_X-node06852   7100165206.800000   1630.996089
L_CRS_X-node06852a  7841650889.760000   1176446198.640000

Eu quero obter o primeiro valor da linha com L_International_node-globe e formatar esse valor para flutuar e gravar o novo valor no arquivo de texto2

Neste exemplo, a saída deve ser o valor '115911592756,879990' e esse valor deve ser armazenado em outro arquivo de texto.

O que você acha deste código:

#!/bin/bash

text1="/path/to/filename1"
text2="/path/to/filename2"
var=0
grep 'L_International_node-globe' text1|tr -s ' ' '\t'|cut -f 2 | sed 's/\./,/' > $var
$var=$var/1000000000        #the result should be in Gigabits
echo $var > text2           #on every execution text2 should have a new value

Este script deve ser executado a cada 5 minutos, então o que você acha da utilização de recursos?

    
por Mekki Ben younes 13.04.2018 / 15:58

2 respostas

2

Assumindo por "ponto flutuante" você quer dizer [-]d.ddde±dd "notação científica" você pode usar awk

awk '/L_International_node-globe/ {printf("%e\n", $2)}' text1 > text2

Você pode usar o especificador %g se quiser que o formato mude entre %f e %e dependendo do tamanho do expoente.

    
por steeldriver 13.04.2018 / 17:59
2

Resposta original

A seguinte linha de comando deve fazer o que você quiser,

grep 'L_International_node-globe' text1|tr -s ' ' '\t'|cut -f 2 > text2
  • imprima a linha com a palavra-chave (e valor) desejada no arquivo text1
  • converte a separação de espaços para TAB
  • imprime o segundo campo (primeiro campo após a palavra-chave)
  • redireciona a saída para o arquivo text2

Não sei ao certo o que você quer dizer com float. O shell irá imprimir a cadeia de caracteres, e vários programas podem interpretá-lo como um número no formato float.

Editar 1

OK, você quer uma vírgula como separador decimal. Isso é feito com a substituição sed .

grep 'L_International_node-globe' text1|tr -s ' ' '\t'|cut -f 2 | sed 's/\./,/' > text2

Editar 2

Em resposta ao seu sugerido shellscript eu sugiro a seguinte versão modificada,

#!/bin/bash

if [ $# -ne 2 ]
then
 echo "
 Usage:    $0 <path/infile> <path/outfile>
 Example:  $0 text1 text2"
 exit
fi

# extracting the value

var=$(grep 'L_International_node-globe' "$1"|tr -s ' ' '\t'|cut -f 2)

echo "debug1: $var"

# install and use 'bc'
# calculation; 'scale' sets the number of decimals in the output (truncated)

var=$(echo "scale=3
$var/1000000000" | bc)  #the result should be in Gigabits

echo "debug2: $var"

# conversion to comma as decimal separator

var=${var/./,}

echo "debug3: $var"

echo "$var" > "$2"   # after every execution the output file should have a new value

Exemplos com dados da sua pergunta original,

$ ./scriptname 

 Usage:    ./scriptname <path/infile> <path/outfile>
 Example:  ./scriptname text1 text2

$ ./script-name text1 text2 ; echo '-----------';cat text2
debug1: 115911592756.879990
debug2: 115.911
debug3: 115,911
-----------
115,911
    
por sudodus 13.04.2018 / 16:17