for循环中的for循环,用于迭代不同扩展名的文件

时间:2019-06-13 14:38:35

标签: shell for-loop

说我有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次。任何建议,将不胜感激。

5 个答案:

答案 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;

对于正在寻找类似内容的人:)