複数のファイルを別のファイル内で特定の順序でリンクしたいと思います。
複数のファイルがあり、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/
行の先頭に内容を追加します。このパターンは、各行の先頭で幅がゼロに一致します。