我有一个C程序,输入是通过命令行提供的。现在,我想从文本文件中传递输入。有两个输入,a和b,逐行写入,如下所示:
a b
2 423
4 56.9
7 83.5现在,我想在一个循环中调用这个txt文件,并逐行传递每个a和b值,以便为每个a和b值生成C程序的输出。
为此,我想编写一个shell脚本,它将在读取模式下调用txt文件,在获得数据之后,它将调用C程序,然后C程序将完成其余的操作,包括输出。
由于我对这个shell脚本很陌生,所以我很困惑如何打开文本文件,然后逐行读取数据,并将它们存储在shell脚本中的某个变量中。
请建议如何在读取模式下打开文本文件,然后读取数据(可能不是整数),并将它们存储在其他变量中。
发布于 2018-07-05 11:33:08
假设“输入是通过命令行提供的”意味着程序接受命令行参数,那么您应该能够使用xargs完成这一任务。
例如。给定一个最小C程序
#include
int main(int argc, char *argv[])
{
printf("Running %s\n", argv[0]);
for(int i=1; i使用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发布于 2018-07-05 12:01:27
下面是这样一个脚本的简单Bash示例:
#!/bin/bash
tail -n +2 "input-file" | sort -u | while read -a args
do
echo "${args[0]}" "${args[1]}"
donetail -n +2 input-file将输出文件./input-file的内容,但没有第一行。这里假设Bash脚本和输入文件位于同一个目录中-- ./是当前目录的路径。|发送到命令sort的标准输入(只有-u将输出唯一的行),这将按照第一列对输入进行排序(使用man sort查找更多选项)。sort -u的输出通过管道传递到while-do-done循环的STDIN,其中每一行将作为数组-a作为read。args。您应该调整这一行-用C程序的路径和名称更改echo。此示例的一行语法是:
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[@]}"
doneinput-file的名称被更改为变量$INPUT_FILE,该值被赋值为初步值。echo "${args[@]}"将同时输出数组args的全部内容。https://askubuntu.com/questions/1052315
复制相似问题