У меня есть следующий файл Bash:

#!/bin/sh

# $1 is path of C executable
# $2 is path of folder with instances
# $3 is path of folder to save results

seed=333

# Write header to output file
echo "instance, cost, time" >> "$3/ACO/run.txt"

# Run ACO
for instance in "$2"/*
do
    y=${instance%.txt}
    output=$(eval "$1 --seed $seed --instance $instance --runtime 10 --aco --rep")

    filename=${y##*/}
    length=${#filename}
    first=$(echo ${filename:3:$length-4} | awk '{print toupper($0)}')
    second=${filename:$length-1:1}

    echo "$first.$second, $output" >> "$3/ACO/run.txt"
done

Этот файл Bash запускает алгоритм на C для каждого экземпляра (файла .txt), расположенного в папке, указанной вторым аргументом ($2). Для этого алгоритма требуются разные аргументы командной строки, как видно из вызова eval (например, --seed и --instance).

Теперь моя проблема в следующем. У меня есть еще один файл .txt, в котором для каждого экземпляра указывается значение аргумента командной строки --runtime. Значения в этом файле находятся в том же порядке, что и экземпляры в папке экземпляров.

Итак, мой вопрос: как я могу одновременно перебирать экземпляры в папке экземпляров и файл runtimes.txt? Кроме того, я бы хотел, чтобы этот файл runtimes.txt был четвертым аргументом этого файла Bash.

0
JNevens 22 Апр 2016 в 18:01

2 ответа

Лучший ответ

Это не особенно элегантно, но одним из вариантов было бы использовать что-то вроде этого:

line=1
for instance in "$2"/*
do
    runtime=$(sed -n "${line}p" "$4")
    line=$(( line + 1 ))
    # etc.
done

Счетчик увеличивается в цикле, и sed используется для печати одной строки с помощью команды p.

Кстати, я думаю, вы можете (и должны!) Отказаться от использования eval в своем скрипте - я не вижу, чтобы он делал что-то полезное.

3
Tom Fenech 22 Апр 2016 в 15:17

Вы можете использовать это для чтения нескольких файлов:

while true
do
  read -r val1 <&3 || break
  read -r val2 <&4 || break
  # do whatever you want with the values
done 3<file1 4<file2
2
Fabich 22 Апр 2016 в 15:18