首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中读取行并将其内容存储到shell脚本中的C程序中

问从文件中读取行并将其内容存储到shell脚本中的C程序中
EN

Ask Ubuntu用户
提问于 2018-07-05 06:18:10
回答 2查看 1.2K关注 0票数 4

我有一个C程序,输入是通过命令行提供的。现在,我想从文本文件中传递输入。有两个输入,a和b,逐行写入,如下所示:

代码语言:javascript
复制
a    b
2   423
4    56.9
7   83.5

现在,我想在一个循环中调用这个txt文件,并逐行传递每个a和b值,以便为每个a和b值生成C程序的输出。

为此,我想编写一个shell脚本,它将在读取模式下调用txt文件,在获得数据之后,它将调用C程序,然后C程序将完成其余的操作,包括输出。

由于我对这个shell脚本很陌生,所以我很困惑如何打开文本文件,然后逐行读取数据,并将它们存储在shell脚本中的某个变量中。

请建议如何在读取模式下打开文本文件,然后读取数据(可能不是整数),并将它们存储在其他变量中。

EN

回答 2

Ask Ubuntu用户

发布于 2018-07-05 11:33:08

假设“输入是通过命令行提供的”意味着程序接受命令行参数,那么您应该能够使用xargs完成这一任务。

例如。给定一个最小C程序

代码语言:javascript
复制
#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文件。

代码语言:javascript
复制
$ cat inputs.txt 
2   423
4    56.9
7   83.5

然后

代码语言:javascript
复制
$ 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并行做类似的事情。

代码语言:javascript
复制
parallel --colsep '[ \t]+' ./someprog {1} {2} :::: inputs.txt
票数 13
EN

Ask Ubuntu用户

发布于 2018-07-05 12:01:27

下面是这样一个脚本的简单Bash示例:

代码语言:javascript
复制
#!/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的输出通过管道传递到while-do-done循环的STDIN,其中每一行将作为数组-a作为read。
  • 此外,echo命令将输出数组的第一个和第二个元素,名为args。您应该调整这一行-用C程序的路径和名称更改echo。

此示例的一行语法是:

代码语言:javascript
复制
tail -n +2 "./input-file" | sort -u | while read -a ar; do echo "${ar[0]}" "${ar[1]}"; done

另一个例子是:

代码语言:javascript
复制
#!/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
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1052315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档