回答:
ファイル名を取得するために単純なコマンド置換を使用しないでください(スペースやその他の特殊文字で簡単に壊れる可能性があります)。次のようなものを使用しますxargs
。
xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
またはwhile read
ループ:
while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
コマンド置換を安全に使用するには、少なくともIFS
改行のみに設定し、グロビング(ワイルドカード拡張)を無効にします。
(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
()
現在のシェルがこれらの変更の影響を受けないように、周囲の括弧はこれをサブシェルで実行します。
早くて汚い方法...
cat $(cat list_of_files.txt) >> all_compounds.sdf
注:これは、リスト内のファイル名が非常に適切に動作している場合にのみ機能します-スペース、改行、またはシェルにとって特別な意味を持つ文字がある場合、問題が発生します- 信頼できる結果を得るために代わりにこの回答を使用してください)
cat
con catはファイルを生成します。また、コンテンツも印刷します。command2 $(command1)
を使用すると、ファイルを連結する()の出力をcommand1
(cat list...
)に渡すことができます。command2
cat
次に>>
、stdoutに出力する代わりに、リダイレクトを使用して出力をファイルに送信します。出力を表示する場合は、tee
代わりに次を使用します。
cat $(cat list_of_files.txt) | tee -a all_compounds.sdf
(私が使用している>>
代わりに>
とtee
して-a
-これはあなたのファイルが既に存在する場合にはスイッチアペンドが既に存在する場合、代わりにそれを上書きするファイルへ)
cat
、リスト全体を1つの引数として取得します。
GNU awk
はテキスト処理ユーティリティですが、system()
呼び出しによって外部シェルコマンドを実行できます。それを次のように有利に活用できます。
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
ここでの考え方は簡単です。ファイルを1行ずつ読み取り、各行から書式付き文字列を作成しcat "File name.txt"
、それをに渡しsystem()
ます。
そして、ここで動作しています:
$ ls
file1.txt file2.txt file3 with space.txt file_list.txt
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
Hi, I'm file2
Hi, I'm file1
Hi, I'm file3
そのため、タスクの大部分は既に完了しています。リスト上のすべてのファイルを印刷しました。残りは簡単です。最終出力を>
演算子付きのファイルにリダイレクトし、要約ファイルに入れます。
awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt > output.txt
"$(cat list_of_files.txt)"