linux基于文件路径循环遍历一组文件

时间:2020-08-02 22:52:11

标签: linux loops

我的目录中包含许多压缩数据以及一些文件名。我有两种文件类型als.sumstats.lmm.chr和als.sumstats.meta.chr。 chr之后是1-22。我只想遍历als.sumstats.meta.chr。但是,我的代码无法正常工作。我一直得到gzip:/ALSsummaryGWAS/Summary_Statistics_GWAS_2016/als.sumstats.meta.chr*.txt.gz:没有这样的文件或目录,这表明我的循环找不到我的文件。有人可以帮忙吗?这就是我现在所拥有的。

#!/bin/bash

FILES=/ALSsummaryGWAS/Summary_Statistics_GWAS_2016/als.sumstats.meta.chr*.txt.gz
for f in $FILES;
do
 echo "$FILES"
 echo "extracting columns 2,1,3,9"
 gunzip -c $f | awk '{print $2, $1, $3, $14+$15}' >> ALSGWAS.txt
done

1 个答案:

答案 0 :(得分:1)

在脚本段中,通配符'*'模式作为字符串存储在$FILES变量中,需要在某个时候对其进行评估以获取匹配文件的列表。

为了对其进行评估,您可以像这样使用eval

FILES="ls -1 /ALSsummaryGWAS/Summary_Statistics_GWAS_2016/als.sumstats.meta.chr*.txt.gz"
for f in $(eval $FILES);
do
    echo "$FILES"
    echo "processing $f"
    echo "extracting columns 2,1,3,9"
    gunzip -c $f | awk '{print $2, $1, $3, $14+$15}' >> ALSGWAS.txt
done

但是建议不要使用eval来进行此类操作(eval is dangerous),因此您可以这样尝试:

FILES=$(ls -1 /ALSsummaryGWAS/Summary_Statistics_GWAS_2016/als.sumstats.meta.chr*.txt.gz)
for f in $FILES;      
do
    echo "$FILES"
    echo "processing $f"
    echo "extracting columns 2,1,3,9"
    gunzip -c $f | awk '{print $2, $1, $3, $14+$15}' >> ALSGWAS.txt
done
相关问题