我想编写一个循环来生成 22 个 R 脚本,其中内容在 echo 中生成。这个循环到底出了什么问题,导致我无法获取到22个文件对应的内容?
我测试过echo "i want that file" > file.r
效果很好。然后我测试了,它被视为两个单独的进程。首先它回显文本,然后生成 22 个空文件。
for i in `seq 1 22`; do
echo "a <- read.delim('file${i}.txt', header=T, check.names=FALSE);
library('splitstackshape');
loc1 <- cSplit(a, 'V1', ':');
rm(a);
out <- cbind.data.frame(loc1$V1_1, loc1$V1_2);
write.table(out, 'out_file${i}.txt', sep='\t', row.names=F, quote=F)";
> build_file${i}.r; done
然后我尝试了这个..仍然不起作用..
for i in `seq 1 22`; do
echo "a <- read.delim("file${i}.txt", header=T, check.names=FALSE);
library("splitstackshape");
loc1 <- cSplit(a, "V1", ":");
rm(a);
out <- cbind.data.frame(loc1$V1_1, loc1$V1_2);
write.table(out, "out_file${i}.txt", sep="\t", row.names=F, quote=F)";
cat > loc_chr${i}.r; done
答案1
不确定我完全遵循脚本中的引用以及您希望命令cat
执行的操作,因为它是从非重定向的标准输入(即可能是您的键盘)读取的。怎么样
for i in `seq 1 22`
do cat <<- EOF > loc_chr${i}.r
"a <- read.delim("file${i}.txt", header=T, check.names=FALSE);
library("splitstackshape");
loc1 <- cSplit(a, "V1", ":");
rm(a);
out <- cbind.data.frame(loc1$V1_1, loc1$V1_2);
write.table(out, "out_file${i}.txt", sep="\t", row.names=F, quote=F)"
EOF
done
答案2
您的第一个代码示例无法正常工作,因为它有> build_file${i}.r
自己的行,该行没有将任何内容重定向到 20 个文件中。附加> build_file${i}.r
到您的末尾echo
。
cat
您的第二个代码示例由于底部而无法工作。您没有提供想要cat
连接的内容,因此它正在等待输入。
您应该删除该cat
行,并将> loc_chr${i}.r
其附加到echo
.
for i in `seq 1 22`; do
echo "a <- read.delim("file${i}.txt", header=T, check.names=FALSE);
library("splitstackshape");
loc1 <- cSplit(a, "V1", ":");
rm(a);
out <- cbind.data.frame(loc1$V1_1, loc1$V1_2);
write.table(out, "out_file${i}.txt", sep="\t", row.names=F, quote=F)" > loc_chr${i}.r
done