Вопрос Написание сценария bash для чтения текстового файла чисел в массивы, по столбцу, на Ubuntu


Я пытаюсь написать небольшой скрипт bash на ubuntu 12.04 и иметь небольшой опыт. Нечетная небольшая проблема преобразования текстового файла чисел в массивы. Мне нужны все первые числа, второй и т. Д. В свой собственный массив, потому что я буду выполнять вычисления по числам на основе столбца больше, чем строка, из которой он пришел. Все строки состоят из 5 целых чисел, разделенных пробелами с возвратом в конце каждой строки. Возможно ли существование многомерного массива в bash? Спасибо!


1
2018-01-15 19:34


происхождения


Можете ли вы дать небольшой пример ввода, который у вас есть и вы хотите получить? Также действительно ли это должно быть bash или может работать октавный скрипт? - Presbitero
Я ценю любую помощь, но позвольте мне уточнить, так как я действительно не имел в виду, что мне нужны двумерные массивы. Скажем, это мой текстовый файл: 1 2 3 4 5 следующая строка: 7 10 200 3 Мне они нужны x (1) = 1, y (1) = 2 .... x (2) = 7, y ( 2) = 10 ... и так далее. - JClar


ответы:


Вот сценарий, он будет хранить номера из текстового файла в два массива x а также y как вы хотели,

#!/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

Не забудьте предоставить разрешение на выполнение скрипта.

chmod +x script.sh

Применение

./script.sh numfile.txt

где я рассматриваю, вы сохраните этот сценарий как script.sh и ваш текстовый файл, содержащий числа, является numfile.txt, И оба находятся в одном каталоге.


2
2018-01-21 11:11





Bash поддерживает только одномерные массивы, хотя небольшая обманка позволяет имитировать многомерные.

Этот документ содержит пример двумерного массива. http://tldp.org/LDP/abs/html/arrays.html

Интересно, легче ли использовать другой язык для вашего использования. Похоже, вы растягиваете пределы того, что может сделать bash, тогда как Python, Perl или Ruby будут легко справляться с этой задачей. Я предполагаю, что инструмент, который вы будете использовать для последующих «вычислений», определит это в значительной степени.


1
2018-01-15 19:48





извините, я не проверил назад. Решение было проще, чем я думал, поскольку числа были разделены пробелом с возвратом в конце строк.

#!/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