我有一个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 中,变量扩展需要加引号。