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

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

1
задан 15 January 2014 в 23:34

3 ответа

Вот скрипт, он будет хранить числа из текстового файла в двух массивах 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. И оба находятся в одном каталоге.

0
ответ дан 15 January 2014 в 23:34

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

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

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

0
ответ дан 15 January 2014 в 23:34
  • 1
    Я чувствую себя глупым для выяснения, но как я делаю это? – Andrew Schalk 7 July 2015 в 03:58

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

#!/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
0
ответ дан 15 January 2014 в 23:34

Другие вопросы по тегам:

Похожие вопросы: