Я пытаюсь написать небольшой сценарий bash для Ubuntu 12.04 и у меня мало опыта. Странная небольшая проблема преобразования текстового файла чисел в массивы. Мне нужны все первые числа, вторые и т. Д. В его собственном массиве, потому что я буду выполнять вычисления для чисел, основанных на столбце больше, чем на строке, из которой он получен. Все строки представляют собой 5 целых чисел, разделенных пробелами с возвратом в конце каждой строки. Возможен ли многомерный массив в bash? Спасибо!
Bash поддерживает только одномерные массивы, хотя небольшая хитрость позволяет имитировать многомерные.
Этот документ содержит пример двумерного массива. http://tldp.org/LDP/abs/html/arrays.html
Интересно, может ли другой язык подойти для вашего варианта использования легче? Похоже, вы расширяете пределы возможностей bash, тогда как Python, Perl или Ruby легко справятся с этой задачей. Я думаю, что инструмент, который вы будете использовать для своих последующих «вычислений», в значительной степени определит это.
Вот скрипт, он будет хранить числа из текстового файла в двух массивах 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
. И оба находятся в одном каталоге.