Bash matemática e arquivos [fechados]

0

Eu preciso fazer algumas contas com as linhas de um arquivo e um número usando o bash. Como em Ruby ou python, você pode facilmente fazer uma string para number ou vice-versa. No bash tudo é sem tipagem.

Eu tenho um arquivo contendo números como este: 1,2,3 eu posso iterar sobre ele com esse retorno exatamente 2.

cat file.txt | sed 's/[^,]//g' | wc -c 

Eu gostaria de armazenar este resultado em uma variável $ e adicionar um número fixo ((3 + 1)). Então, por exemplo, $ total = 2 + 3 + 1 = 6. Como posso armazenar o resultado do comando unix em uma variável para uso posterior?

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c ) 
echo "elements are: $number_of_elements" #2
lines = $(( $number_of_elements + 3 + 1)) & echo "lines are: $lines " #2+3+1
cat file.txt | grep -A $lines "text " > output.txt #open file, grep the "text" and the 6 lines that come after.

Parece que há problemas: - comando não encontrado para a linha 1/3 - e como um grep conseguence ele não funciona com $ lines

    
por heisen 10.10.2016 / 11:25

3 respostas

1

Editar II: Você pode NÃO ter espaços no Bash quando você atribui uma variável. Isso (do seu post):

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )

... não funcionará. Mas isso vai:

number_of_elements=$( sed 's/[^,]//g' elements.txt | wc -c )

Remova os espaços antes e depois do sinal = . Por favor, leia a resposta do @heemayl bem escrito (e votado) sobre como usar a substituição de comandos!


I would like to store this result in a $variable, and the adding a fixed number ((3+1)). so e.g $total = 2 + 3 + 1 = 6. How can I store the result of unix command in a variable for further use?

Algo parecido com isto:

myVar=2
total=$(($myVar+2+3+1))
echo $total
8

Aqui, a variável $myVar (contendo o inteiro 2 ) é usada e, em seguida, adicionamos os inteiros 2 , 3 e 1 , que são salvos em uma nova variável $total .

    
por 10.10.2016 / 11:37
2

Você precisa de uma substituição de comando, $() :

variable=$(sed 's/[^,]//g' file.txt | wc -c)

Agora você pode obter o valor que a variável refere usando $variable . Note que, é quase sempre uma boa ideia citar a variável enquanto expande para evitar efeitos inesperados (divisão de palavras e expansão de nome de caminho), então é melhor usar "$variable" .

Note que, eu removi o cat file.txt como sed recebe o (s) nome (s) como argumento.

    
por 10.10.2016 / 11:29
1
number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )

Tentaria executar o comando number_of_elements com = e o resultado de split + glob aplicado à saída do comando wc como argumentos. Em shells do tipo Bourne, as atribuições de variáveis escalares são com var=value sem caractere de espaço em torno do = (o var também deve ser literal e ser um nome de variável válido).

Observe também que o comando sed removeria todos, exceto os , , newline e bytes que não fazem parte de caracteres válidos em elements.txt .

Se você quiser contar somente os caracteres , , faça o seguinte:

count=$(tr -cd , < elements.txt | wc -c)

Para , e nova linha:

count=$(tr -cd ',\n' < elements.txt | wc -c)

(embora tenha cuidado com a implementação de wc , $count pode ter alguns espaços em branco iniciais ou finais).

Para adicionar um número:

count=$(($(tr -cd , < elements.txt | wc -c) + 1))

O conteúdo de $((...)) é tratado como se estivesse dentro de "..." : expansão de parâmetro, expansão aritmética e substituição de comando ainda são executadas. Para remover os espaços em branco extras mencionados acima, você pode fazer:

count=$(($(... | wc -c)))

em vez de:

count=$(... | wc -c)
    
por 10.10.2016 / 12:19