将多个文件(gz)传送到C程序中

时间:2010-03-20 22:39:10

标签: c++ c shell pipe gunzip

我编写了一个C程序,当我使用stdin将数据传输到我的程序时可以正常工作:

gunzip -c IN.gz|./a.out

如果我想在文件列表上运行我的程序,我可以执行以下操作:

for i `cat list.txt`
do
  gunzip -c $i |./a.out
done

但这将启动我的程序'文件数'次。 我有兴趣将所有文件传递到同一个进程中。

喜欢做

for i `cat list.txt`
do
  gunzip -c $i >>tmp
done
cat tmp |./a.out

我该怎么做?

5 个答案:

答案 0 :(得分:2)

您应该可以让一个gunzip进程解压缩多个文件。

zcat $(cat list.txt) | ./a.out

zcat是在许多系统上调用gunzip -c的另一种方式,并显示与cat的并行;但如果您的系统gzcatzcat,请检查uncompress实际上是( for i in $(cat list.txt) do gunzip -c "$i" done ) | ./a.out 。)

或者你可以使用子shell。

{{1}}

答案 1 :(得分:2)

不需要shell循环:

gzip -cd $(<list.txt) | ./a.out

使用“-cd”选项,gzip会将文件列表解压缩为标准输出(或者您可以使用“gunzip -c”)。 $(<file)表示法将命名文件的内容扩展为参数列表,而不启动子进程。否则相当于$(cat list.txt)

但是,如果您觉得必须使用循环,那么只需将循环中的输出传递到程序的单个实例中:

for i in `cat list.txt`
do
    gunzip -c $i
done |
./a.out

如果循环的内容更复杂(而不是简单地解压缩单个文件),这可能是必要的。您还可以使用“{ ... }”I / O重定向:

{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
    gunzip -c $i
done
} |
./a.out

或者:

{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
    gunzip -c $i
done; } |
./a.out
注意分号;有必要用括号。在此示例中,它与使用带括号的正式子shell基本相同:

(
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
    gunzip -c $i
done
) |
./a.out

或者:

( cat /etc/passwd /etc/group
  for i in `cat list.txt`
  do
      gunzip -c $i
  done) |
./a.out

注意这里没有分号;它不是必需的。外壳有时非常狡猾。当您需要在管道符号后面对命令进行分组时,大括号I / O重定向非常有用:

some_command arg1 arg2 |
{
first sub-command
second command
for i in $some_list
do
    ...something with $i...
done
} >$outfile 2>$errfile

答案 2 :(得分:1)

这是一个shell问题。但你可以做AFAIK:

cat file* | your_program

for i in file*; do gunzip -c $i; done | your_program

答案 3 :(得分:0)

如果您的程序不需要知道特定输入何时结束而另一个输入何时开始,您可以这样做:

for i `cat list.txt`
do
  gunzip -c $i
done |./a.out

我希望它会对你有所帮助 此致

答案 4 :(得分:0)

xargs是你的朋友

%cat list.txt | xargs gunzip -c | ./a.out

如果list.txt中的文件中有空格,那么你需要经过一些额外的箍。