他のファイルに基づいて特定の順序でファイルを関連付ける

他のファイルに基づいて特定の順序でファイルを関連付ける

複数のファイルを別のファイル内で特定の順序でリンクしたいと思います。

複数のファイルがあり、freq_<something>それをリンクしたいと思います。 「something」は「list」という別のファイルにリストされています。

私のリストは次のとおりです。

$ cat list
003137F
002980F
002993F

私がしたい:

cat freq_003137F freq_002980F freq_002993F > freq_all

しかし、私のリストには何百もの値が含まれているので、実際にはそうすることはできません!

これを自動化する方法はありますか?としてファイルを添付できると思いましたが、while read line失敗しました...

ありがとうございます!

中サイズ

答え1

使用xargs

xargs -i cat freq_'{}' < list > freq_all

答え2

を使用してこれを行うことができますwhile。なぜできないのですか?これは働きます:

while read suffix; do cat freq_"${suffix}"; done < list > freq_all; done

または、以下を使用してコマンドを生成し、printf手動で実行することもできます。

$ echo "cat $(printf 'freq_%s ' $(cat list)) > freq_out"
cat freq_003137F freq_002980F freq_002993F > freq_out

または直接実行してください。

cat $(printf 'freq_%s ' $(cat list)) > freq_out

答え3

xargsを使用したい場合は、通常、単一プロセスのコマンドラインに複数の引数を配置する機能を利用したいと思います。 (プロセス開始オーバーヘッドが与えられると、catそのパラメータを繰り返すプロセスを実行することは、各ファイルに対して別々のプロセスを実行するよりも効率的です。)cat

xargs '-I{}' cat freq_'{}'残念ながら、これは暗示されており、-x -L 1コマンドごとに複数の引数を実行するためのオーバーライドを拒否します。

sed代わりに交換を使用できます。これを1つほどしたらいいと思います。非常に@terdonの答えでbashコマンドをprintfに置き換えるには大きすぎるリストです。 xargsは、引数を最大128kiB(デフォルト)のテキストの塊としてバッチ処理することを知っています。

sed 's/^/freq_/' list | xargs -d'\n' cat   > freq_out

s/^/foo/行の先頭に内容を追加します。このパターンは、各行の先頭で幅がゼロに一致します。

関連情報