说我有20个不同的文件。前10个文件以.counts.tsv
结尾,其余文件以.libsize.tsv
结尾。对于每个.counts.tsv
,都有匹配的.libsize.tsv
文件。我想使用for循环来选择这两个文件,并针对这两种文件类型运行R脚本。
这是我尝试过的,
#!/bin/bash
arti='/home/path/tofiles'
for counts in ${arti}/*__counts.tsv ; do
for libsize in "$arti"/*__libsize.tsv ; do
Rscript score.R ${counts} ${libsize}
done;
done;
上面的shell脚本对文件进行了200次以上的迭代,而我只有20个文件。我需要两个文件的Rscript都执行10次。任何建议,将不胜感激。
答案 0 :(得分:3)
我开始输入答案,然后才看到您只对bash解决方案感兴趣的评论,无论如何发帖,以防将来有人发现此问题并接受基于R
的解决方案。
如果我是从头开始的,那么我可能只是使用文件中定义的R函数,该函数接受两个文件名,而不是弄乱system()
调用,但这将提供您的行为欲望。
## Get a vector of files matching each extension
counts_names <- list.files(path = ".", pattern ="*.counts.tsv")
libsize_names <- list.files(path = ".", pattern ="*.libsize.tsv")
## Get the root names of the files before the extensions
counts_roots <- gsub(".counts.tsv$", "",counts_names)
libsize_roots <- gsub(".libsize.tsv$", "",libsize_names)
## Get only root names that have both file types
shared_roots <- intersect(libsize_roots,counts_roots)
## Loop through the shared root names and execute an Rscript call based on the two files
for(i in seq_along(shared_roots)){
counts_filename <- paste0(shared_roots[[i]],".counts.tsv")
libsize_filename <- paste0(shared_roots[[i]],".libsize.tsv")
Command <- paste("Rscript score.R",counts_filename,libsize_filename)
system(Command)
}
答案 1 :(得分:3)
使用${counts%counts.tsv}
构建第二个文件名(删除最后一部分)。
#!/bin/bash
arti='/home/path/tofiles'
for counts in ${arti}/*__counts.tsv ; do
libsize="${counts%counts.tsv}libsize.tsv"
Rscript score.R "${counts}" "${libsize}"
done
编辑:
不太安全的尝试是使其成为一体。如果文件名中没有空格和换行符,则可能会发生意外事故
echo ${arti}/*counts.tsv ${arti}/*.libsize.tsv | xargs -n2 Rscript score.R
并且当您感到非常幸运时(除了$arti
中没有其他tsv文件之外,没有其他文件),使蹦极跳与
echo ${arti}/* | xargs -n2 Rscript score.R
答案 2 :(得分:1)
您是否曾尝试使用import math
df_num_of_cols=len(df.columns)
chunknum=math.floor(2100/df_num_of_cols)
df.to_sql('MY_TABLE',con=engine,schema='myschema',chunksize=chunknum,if_exists='append',method='multi',index=False )
?这将允许您使用该文件夹中的所有文件。
list.files
答案 3 :(得分:1)
看看以下内容是否有帮助。
my_list = list.files("./Data")
counts = grep("counts.tsv", my_list, value=T)
libsize = grep("libsize.tsv", my_list, value=T)
for (i in seq(length(counts))){
system(paste("Rscript score.R",counts[i],libsize[i]))
}
答案 4 :(得分:0)
最后,
我尝试了以下方法,它对我有帮助
for sam in "$arti"/*__counts.tsv ; do
filebase=$(basename $sam)
samples=$(ls -1 ${filebase}|awk -F'[-1]' '{print $1}')
Rscript score.R ${samples}__counts.tsv ${samples}__libsize.tsv
done;
对于正在寻找类似内容的人:)