Questão Escrevendo um script bash para ler um arquivo de texto de números em arrays, por coluna, no Ubuntu


Estou tentando escrever um pequeno script bash no Ubuntu 12.04 e tenho pouca experiência. Um pequeno problema estranho ao converter um arquivo de texto de números em matrizes. Eu preciso de todos os primeiros números, segundo, etc em sua própria matriz, porque eu vou estar executando cálculos em números com base na coluna mais do que a linha de onde veio. Todas as linhas são 5 inteiros separados por espaços com um retorno no final de cada linha. Um array multidimensional é possível no bash? Obrigado!


1
2018-01-15 19:34


origem


Você pode dar um pequeno exemplo da entrada que você tem e da saída que você quer? Também precisa realmente ser bash ou um script de oitava também funciona? - Presbitero
Eu aprecio qualquer ajuda, mas deixe-me esclarecer uma vez que eu realmente não quis dizer que eu precisava de arrays bidimensionais. Vamos dizer que este é o meu arquivo de texto: 1 2 3 4 5 próxima linha: 7 10 200 3 Eu preciso deles armazenados x (1) = 1, y (1) = 2 .... x (2) = 7, y ( 2) = 10 ... e assim por diante. - JClar


Respostas:


Aqui está um script, ele irá armazenar números de arquivo de texto em duas matrizes x e y Como você desejou,

#!/bin/bash

nl=$(cat "$1" | wc -l)
declare -a x
declare -a y
for i in $(seq 1 $nl)
do
    x[i]="$(cat "$1" | awk -v p="$i" '{if(NR==p) print $1}')"
    y[i]="$(cat "$1" | awk -v p="$i" '{if(NR==p) print $2}')"
done
#upto this point all the numbers from first and second column of the file are stored 
#into x and y respectively. Following lines will just print them again for you.
for it in $(seq 1 $nl)
do
    echo "${x[$it]} ${y[$it]}"
done

Não esqueça de dar a permissão de execução de script.

chmod +x script.sh

Uso

./script.sh numfile.txt

onde eu estou pensando em você vai salvar o script acima como script.sh e seu arquivo de texto contendo números é numfile.txt. E ambos estão no mesmo diretório.


2
2018-01-21 11:11





O Bash suporta apenas matrizes unidimensionais, embora um pequeno truque permita simular as multidimensionais.

Este documento contém um exemplo de um array bidimensional. http://tldp.org/LDP/abs/html/arrays.html

Gostaria de saber se outro idioma pode ser mais adequado ao seu caso de uso. Parece que você está esticando os limites do que o bash pode fazer, enquanto Python, Perl ou Ruby lidariam com essa tarefa com facilidade. Eu acho que a ferramenta que você usará para seus "cálculos" subseqüentes determinará isso em grande medida.


1
2018-01-15 19:48





desculpe, eu não chequei de volta. A solução era mais simples do que eu pensava, já que os números eram separados por um espaço com um retorno no final das linhas.

#!/bin/bash
COUNT=1
while read arr1[COUNT] arr2[COUNT] arr3[COUNT] arr4[COUNT] arr5[COUNT]
do
echo "next line"
 echo "${arr1[COUNT]}" 
 echo "${arr2[COUNT]}"
 echo "${arr3[COUNT]}"
 echo "${arr4[COUNT]}"
 echo "${arr5[COUNT]}"
COUNT=$[$COUNT +1]
done < /home/john/testloop.txt

-1
2018-01-21 15:23