Разделить два числа на два массива - PullRequest
0 голосов
/ 12 октября 2019

Мне нужно разделить 2 числа в форме (они из текстового файла):

Num1:Num2
Num3:Num4

И сохранить num1 в массиве X и номер 2 в массиве Y num 3 в массиве X и num4 вмассив Y.

Ответы [ 4 ]

1 голос
/ 12 октября 2019

Вы можете выполнить следующие шаги:

  • Создать целевые массивы пустыми
  • Читать файл построчно, с классическим while read ... < file циклом
  • Разделять каждыйстрока на :, снова используя read
  • Добавить значения к массивам

Например:

arr_x=()
arr_y=()
while IFS= read line || [ -n "$line" ]; do
    IFS=: read x y <<< "$line"
    arr_x+=("$x")
    arr_y+=("$y")
done < data.txt

echo "content of arr_x:"
for v in "${arr_x[@]}"; do
    echo "$v"
done

echo "content of arr_y:"
for v in "${arr_y[@]}"; do
    echo "$v"
done
1 голос
/ 13 октября 2019

Вот быстрое решение для bash:

c=0
while IFS=: read a b ;do
 x[$c]="$a"
 y[$c]="$b"
 c=$((c+1))
done < input.txt

Мы отправляем input.txt в цикл while, используя Разделитель полей ввода: и читаем первое число каждой строки как $ a, а второе число как$ б. Затем мы добавляем их в массив, как вы указали. Мы используем счетчик $ c для итерации местоположения в массивах.

1 голос
/ 12 октября 2019

С bash:

mapfile -t X < <(cut -d : -f 1 file) # read only first column
mapfile -t Y < <(cut -d : -f 2 file) # read only second column
declare -p X Y

Вывод:

declare -a X='([0]="num1" [1]="num3")'
declare -a Y='([0]="num2" [1]="num4")'

Недостаток: файл читается дважды.

0 голосов
/ 13 октября 2019

Использование оператора =~ для сохранения пары чисел в массиве $BASH_REMATCH:

$ cat file
123:456
789:012
$ while read -r line
do 
    [[ $line =~ ([^:]*):(.*) ]] && echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}
    # do something else with numbers as they will be replaced on the next iteration
done < file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...