0

次のようなstdinを使用してデータをプログラムにパイプするときに機能するCプログラムを作成しました。

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

これどうやってするの?

4

5 に答える 5

2

gunzip1つのプロセスで複数のファイルを解凍できるはずです。

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

zcatこれは多くのシステムを呼び出す別の方法であり、 ;gunzip -cとの類似点を示していますが、システムが実際にそうであるかどうかを確認してください。)catgzcatzcatuncompress

または、サブシェルを使用することもできます。

(
  for i in $(cat list.txt)
  do
    gunzip -c "$i"
  done
) | ./a.out
于 2010-03-20T22:44:13.287 に答える
2

シェルループは必要ありません。

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

セミコロンに注意してください。中かっこで必要です。この例では、括弧付きの正式なサブシェルを使用するのと基本的に同じです。

(
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
于 2010-03-20T22:53:55.357 に答える
1

これはむしろシェルの質問です。しかし、あなたができるAFAIK:

cat file* | your_program

また

for i in file*; do gunzip -c $i; done | your_program
于 2010-03-20T22:46:21.177 に答える
0

プログラムが特定の入力がいつ終了し、別の入力がいつ開始するかを知る必要がない場合は、次のようにすることができます。

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

よろしくお願いします

于 2010-03-20T22:45:04.943 に答える
0

xargsはあなたの友達です

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

list.txt内のファイルにスペースが含まれている場合は、追加のフープを実行する必要があります。

于 2010-03-28T14:44:40.110 に答える