
我有一個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 中,變數擴展需要加引號。