У меня есть программа на C, и ввод данных осуществляется через командную строку. Теперь я хочу передать входные данные из текстового файла. Есть два входа, a
и b
, записанные построчно, как это:
a b
2 423
4 56.9
7 83.5
Теперь я хочу вызвать этот текстовый файл в цикле и передать каждый a
и b
значение построчно, так что вывод программы C генерируется для каждого значения a
и b
.
Для этого я хочу написать сценарий оболочки, который будет вызывать txt-файл в режиме чтения, и после получения данных он вызовет программу C, а затем программа C сделает все остальное, включая вывод.
Поскольку я новичок в этом сценарии оболочки, я не понимаю, как открыть текстовый файл, а затем читать строку за строкой и сохранять их в некоторой переменной в сценарии оболочки.
Пожалуйста, предложите, как я могу открыть текстовый файл в режиме чтения, а затем прочитать данные (которые не всегда могут быть целыми числами) и сохранить их в некоторых других переменных.
Вот простой пример Bash такого сценария:
#!/bin/bash
tail -n +2 "input-file" | sort -u | while read -a args
do
echo "${args[0]}" "${args[1]}"
done
Первая команда tail -n +2 input-file
произведет содержание файла ./input-file
, но без первой строки. Здесь принят, что сценарий Bash и входной файл находятся в том же каталоге - ./
путь к текущему каталогу.
Этот вывод будет передан по каналу |
к стандартному входу команды sort
(с -u
только уникальные строки будут произведены), который отсортирует этот вход по первому столбцу (использование man sort
узнать больше опций).
Вывод команды sort -u
передается по каналу к STDIN while-do-done
цикл, где каждая строка будет read
как массив -a
.
Далее команда эха произведет первое и второй элемент массива, названного args
. Необходимо настроить эту строку - изменение echo
с путем и названием Вашей программы C.
Один синтаксис строки этого примера:
tail -n +2 "./input-file" | sort -u | while read -a ar; do echo "${ar[0]}" "${ar[1]}"; done
Другой пример:
#!/bin/bash
INPUT_FILE="/path/to/input-file"
tail -n +2 "$INPUT_FILE" | sort -u | while read -a args
do
echo "${args[@]}"
done
input-file
изменяется с переменной $INPUT_FILE
, какое значение присвоено предварительный.echo "${args[@]}"
произведет целое содержание массива args
одновременно.Принимающие "исходные данные даны через командную строку", означает, что программа принимает параметры командной строки, затем необходимо смочь сделать это с xargs
Напр. учитывая минимальную программу C
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Running %s\n", argv[0]);
for(int i=1; i<argc; i++) printf("arg %d = %s\n", i, argv[i]);
printf("\n");
}
скомпилированный с gcc -o someprog someprog.c
, и файл разделенных от пробела входных параметров inputs.txt
$ cat inputs.txt
2 423
4 56.9
7 83.5
Затем
$ xargs -L1 ./someprog < inputs.txt
Running ./someprog
arg 1 = 2
arg 2 = 423
Running ./someprog
arg 1 = 4
arg 2 = 56.9
Running ./someprog
arg 1 = 7
arg 2 = 83.5
Если Ваш входной файл будет иметь заголовок, то необходимо будет удалить его (использование tail
например).
Если параллельная обработка была бы в вычислительном отношении выгодна для Вашей задачи, то Вы могли сделать подобную вещь с Параллелью GNU
parallel --colsep '[ \t]+' ./someprog {1} {2} :::: inputs.txt