在 while 循环中命名输出文件

在 while 循环中命名输出文件

我有一个input.txt包含三列的文件

A B Z
C D Y
E F X

我想读取前两个字段,执行一些功能并用最后一个字段命名输出。

while IFS=" " read -r f1 f2 f3; do cat $f1 $f2 > $f3; done < file.txt

我如何将其应用于更长的代码

input.sample.text以下三列

../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存在(并且是唯一的),并且不会混淆第三列是什么,即第 1、2 和 3 列不应包含字段分隔符。

awk还允许您对前两列进行多次操作。

答案2

您可以重定向命令组或任何形式的复合命令来重定向多个命令的输出,无论它是否是 while 循环:

while IFS=" " read -r f1 f2 f3; do
  {
    cat < "$f1"
    echo whatever
    cat < "$f2"
    echo end
  } > "$f3"
done < file.txt

还要记住,在 POSIX shell 中,变量扩展需要加引号。

相关内容