如何在批量文件上运行命令?

时间:2016-04-08 13:06:25

标签: bash unix terminal

我有一个感兴趣的文件与此表达式匹配的目录:

ls ../a2i_2_{1..96}M.sorted.DEXseq.txt
../a2i_2_10M.sorted.DEXseq.txt  ../a2i_2_25M.sorted.DEXseq.txt  ../a2i_2_3M.sorted.DEXseq.txt   ../a2i_2_54M.sorted.DEXseq.txt  ../a2i_2_69M.sorted.DEXseq.txt  ../a2i_2_83M.sorted.DEXseq.txt
../a2i_2_11M.sorted.DEXseq.txt  ../a2i_2_26M.sorted.DEXseq.txt  ../a2i_2_40M.sorted.DEXseq.txt  ../a2i_2_55M.sorted.DEXseq.txt  ../a2i_2_6M.sorted.DEXseq.txt   ../a2i_2_84M.sorted.DEXseq.txt
../a2i_2_12M.sorted.DEXseq.txt  ../a2i_2_27M.sorted.DEXseq.txt  ../a2i_2_41M.sorted.DEXseq.txt  ../a2i_2_56M.sorted.DEXseq.txt  ../a2i_2_70M.sorted.DEXseq.txt  ../a2i_2_85M.sorted.DEXseq.txt
../a2i_2_13M.sorted.DEXseq.txt  ../a2i_2_28M.sorted.DEXseq.txt  ../a2i_2_42M.sorted.DEXseq.txt  ../a2i_2_57M.sorted.DEXseq.txt  ../a2i_2_71M.sorted.DEXseq.txt  ../a2i_2_86M.sorted.DEXseq.txt
../a2i_2_14M.sorted.DEXseq.txt  ../a2i_2_29M.sorted.DEXseq.txt  ../a2i_2_43M.sorted.DEXseq.txt  ../a2i_2_58M.sorted.DEXseq.txt  ../a2i_2_72M.sorted.DEXseq.txt  ../a2i_2_87M.sorted.DEXseq.txt
../a2i_2_15M.sorted.DEXseq.txt  ../a2i_2_2M.sorted.DEXseq.txt   ../a2i_2_44M.sorted.DEXseq.txt  ../a2i_2_59M.sorted.DEXseq.txt  ../a2i_2_73M.sorted.DEXseq.txt  ../a2i_2_88M.sorted.DEXseq.txt
../a2i_2_16M.sorted.DEXseq.txt  ../a2i_2_30M.sorted.DEXseq.txt  ../a2i_2_45M.sorted.DEXseq.txt  ../a2i_2_5M.sorted.DEXseq.txt   ../a2i_2_74M.sorted.DEXseq.txt  ../a2i_2_89M.sorted.DEXseq.txt
../a2i_2_17M.sorted.DEXseq.txt  ../a2i_2_31M.sorted.DEXseq.txt  ../a2i_2_46M.sorted.DEXseq.txt  ../a2i_2_60M.sorted.DEXseq.txt  ../a2i_2_75M.sorted.DEXseq.txt  ../a2i_2_8M.sorted.DEXseq.txt
../a2i_2_18M.sorted.DEXseq.txt  ../a2i_2_32M.sorted.DEXseq.txt  ../a2i_2_47M.sorted.DEXseq.txt  ../a2i_2_61M.sorted.DEXseq.txt  ../a2i_2_76M.sorted.DEXseq.txt  ../a2i_2_90M.sorted.DEXseq.txt
../a2i_2_19M.sorted.DEXseq.txt  ../a2i_2_33M.sorted.DEXseq.txt  ../a2i_2_48M.sorted.DEXseq.txt  ../a2i_2_62M.sorted.DEXseq.txt  ../a2i_2_77M.sorted.DEXseq.txt  ../a2i_2_91M.sorted.DEXseq.txt
../a2i_2_1M.sorted.DEXseq.txt   ../a2i_2_34M.sorted.DEXseq.txt  ../a2i_2_49M.sorted.DEXseq.txt  ../a2i_2_63M.sorted.DEXseq.txt  ../a2i_2_78M.sorted.DEXseq.txt  ../a2i_2_92M.sorted.DEXseq.txt
../a2i_2_20M.sorted.DEXseq.txt  ../a2i_2_35M.sorted.DEXseq.txt  ../a2i_2_4M.sorted.DEXseq.txt   ../a2i_2_64M.sorted.DEXseq.txt  ../a2i_2_79M.sorted.DEXseq.txt  ../a2i_2_93M.sorted.DEXseq.txt
../a2i_2_21M.sorted.DEXseq.txt  ../a2i_2_36M.sorted.DEXseq.txt  ../a2i_2_50M.sorted.DEXseq.txt  ../a2i_2_65M.sorted.DEXseq.txt  ../a2i_2_7M.sorted.DEXseq.txt   ../a2i_2_94M.sorted.DEXseq.txt
../a2i_2_22M.sorted.DEXseq.txt  ../a2i_2_37M.sorted.DEXseq.txt  ../a2i_2_51M.sorted.DEXseq.txt  ../a2i_2_66M.sorted.DEXseq.txt  ../a2i_2_80M.sorted.DEXseq.txt  ../a2i_2_95M.sorted.DEXseq.txt
../a2i_2_23M.sorted.DEXseq.txt  ../a2i_2_38M.sorted.DEXseq.txt  ../a2i_2_52M.sorted.DEXseq.txt  ../a2i_2_67M.sorted.DEXseq.txt  ../a2i_2_81M.sorted.DEXseq.txt  ../a2i_2_96M.sorted.DEXseq.txt
../a2i_2_24M.sorted.DEXseq.txt  ../a2i_2_39M.sorted.DEXseq.txt  ../a2i_2_53M.sorted.DEXseq.txt  ../a2i_2_68M.sorted.DEXseq.txt  ../a2i_2_82M.sorted.DEXseq.txt  ../a2i_2_9M.sorted.DEXseq.txt

我想在12个批次的8个文件中运行命令。因此我制作了这个剧本:

#!/bin/bash

prefix="a2i_2_"
sufix="M.sorted.DEXseq.txt"

    for i in {0..7}
         do
            a=$(($i*12+1))
            b=$(($i*12+12))

            ls ../$prefix{$a..$b}$sufix


         done

不幸的是,这不起作用,因为{$ a .. $ b}被解释为字符串而不是序列。所以我得到了这些错误......

ls: cannot access ../a2i_2_{1..12}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{13..24}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{25..36}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{37..48}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{49..60}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{61..72}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{73..84}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{85..96}M.sorted.DEXseq.txt: No such file or directory

如何以可被解释为序列的方式表达{$ a .. $ b}?或者至少如果您知道批量分离这些文件的替代方法也适用于我。

作为替代方案,我可以将文件(或制作符号链接)移动到不同的文件夹中并运行我想要的命令

#!/bin/bash

prefix="a2i_2_"
sufix="M.sorted.DEXseq.txt"

for i in {0..7}
     do
        a=$(($i*12+1))
        b=$(($i*12+12))

        for n in $(seq $a $b)

            do

                ln -s ../$prefix$n$sufix .


            done

        # And now I can run the command for each batch ...

        awk '{sums[$1] += $2;} END { for (i in sums) print i " " sums[i]; }' *$sufix | sort -k1  > $prefix$a-$b$sufix.sum
        rm *$sufix

     done

...但我想学习更直接的方法。

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

您需要评估您构建的表达式,例如

$ a=3;b=7; echo {$a..$b};
{3..7}

$ a=3;b=7; eval echo {$a..$b}
3 4 5 6 7
然而,这不是正确的方法。您可以使用seq

获取值

例如

$ a=3;b=7; seq $a $b
3
4
5
6
7

由于您使用awk为什么不以全功率使用它,您可以消除大部分问题

例如,模板解决方案

$ awk 'c==0{start=FILENAME} 
     FNR==1{c++} 
           {sum+=$2} 
       c==8{print start"-"FILENAME; c=0; print sum; delete sum}' file{1..100}

它打印一批8的总和,文件顺序是通过大括号扩展。 唯一的缺点是它将跳过空文件。