input.txt
3つの列があるファイルがあります
A B Z
C D Y
E F X
最初の 2 つのフィールドを読み取り、何らかの機能を実行し、最後のフィールドで出力に名前を付けたいと思います。
while IFS=" " read -r f1 f2 f3; do cat $f1 $f2 > $f3; done < file.txt
これを長いコードに適用するにはどうすればいいでしょうか
にはinput.sample.text
次の3つの列があります
../Data/G20P1sc-C05-R1.fastq.gz ../Data/G20P1sc-C05-R1.fastq.gz G20P1sc-C05
../Data/G20P1sc-C08-R1.fastq.gz ../Data/G20P1sc-C08-R1.fastq.gz G20P1sc-C08
while IFS=" " read -r f1 f2 f3; do rsem-calculate-expression --star --star-path /share/pkg/star/2.7.0e/bin --temporary-folder --star-gzipped-read-file --paired-end $f1 $f2 ../genome_indices/rsem-star/rsem-star ../test_results/$f3; done < src_pdm3012/input.sample.text
出力には次のエラーがあります
EXITING: FATAL INPUT ERROR: empty value for parameter "outFileNamePrefix" in input "Command-Line-Initial"
SOLUTION: use non-empty value for this parameter
を明示的に使用しようとしました--outFileNamePrefix
が、同じエラーが発生します
while IFS=" " read -r f1 f2 f3; do rsem-calculate-expression --star --star-path /share/pkg/star/2.7.0e/bin --temporary-folder --star-gzipped-read-file --paired-end $f1 $f2 ../genome_indices/rsem-star/rsem-star --outFileNamePrefix $f3; done < ../src_pdm3012/input.sample.text
答え1
これを行うには次のスクリプトをお勧めしますawk
:
awk '{ print $1,$2 > $3}'
もちろん、 が$3
存在し (かつ一意である)、3 番目の列が何であるかに関して矛盾がないことを確認する必要があります。つまり、列 1、2、および 3 にはフィールド区切り文字を含めないでください。
awk
最初の 2 つの列に対してさまざまな操作を行うこともできます。
答え2
while ループであるかどうかに関係なく、コマンド グループまたは任意の形式の複合コマンドをリダイレクトして、複数のコマンドの出力をリダイレクトできます。
while IFS=" " read -r f1 f2 f3; do
{
cat < "$f1"
echo whatever
cat < "$f2"
echo end
} > "$f3"
done < file.txt
また、POSIX シェルでは変数の展開を引用符で囲む必要があることにも注意してください。