Цикл по набору файлов linux на основе пути к файлу - PullRequest
0 голосов
/ 03 августа 2020

У меня есть каталог с большим количеством сжатых данных с парой имен файлов. У меня есть два типа файлов: als.sumstats.lmm.chr и als.sumstats.meta.chr. После chr стоит цифра 1-22. Я хочу l oop через als.sumstats.meta.chr. Однако мой код не работает. Я продолжаю получать gzip: /ALSsummaryGWAS/Summary_Statistics_GWAS_2016/als.sumstats.meta.chr*.txt.gz: нет такого файла или каталога, что говорит о том, что мои файлы не обнаруживаются с моим l oop. Может кому поможет. Это то, что у меня сейчас есть.

#!/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 Ответ

1 голос
/ 03 августа 2020

Во фрагменте сценария шаблон подстановочного знака '*' хранится в виде строки в переменной $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 опасен ), поэтому вы можете попробовать вот так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...