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シェルでは、変数の拡張に引用符が必要であることも覚えておいてください。