Чтение строк из файла и сохранение их содержимого для передачи программе на C в сценарии оболочки

У меня есть программа на C, и ввод данных осуществляется через командную строку. Теперь я хочу передать входные данные из текстового файла. Есть два входа, a и b, записанные построчно, как это:

a    b
2   423
4    56.9
7   83.5

Теперь я хочу вызвать этот текстовый файл в цикле и передать каждый a и b значение построчно, так что вывод программы C генерируется для каждого значения a и b.

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

Поскольку я новичок в этом сценарии оболочки, я не понимаю, как открыть текстовый файл, а затем читать строку за строкой и сохранять их в некоторой переменной в сценарии оболочки.

Пожалуйста, предложите, как я могу открыть текстовый файл в режиме чтения, а затем прочитать данные (которые не всегда могут быть целыми числами) и сохранить их в некоторых других переменных.

4
задан 5 July 2018 в 15:57

2 ответа

Вот простой пример 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 одновременно.
5
ответ дан 5 July 2018 в 15:57

Принимающие "исходные данные даны через командную строку", означает, что программа принимает параметры командной строки, затем необходимо смочь сделать это с 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
12
ответ дан 5 July 2018 в 15:57

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

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