【问题标题】:How can I run a command over batches of files?如何对批量文件运行命令?
【发布时间】:2016-04-08 13:06:25
【问题描述】:

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

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

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

感谢您的宝贵时间。

【问题讨论】:

  • 听起来很有趣,你如何在这个问题上实现 xargs?
  • 好的,这很酷。使用 xargs,我可以分块执行 for 循环。例如,我可以在 $(ls ../*.DEXseq.txt | xargs -L 12); 中执行 'for i回声 $i;完成' ...有了这个,我基本上可以做与我上一个代码相同的事情,但只需几行。谢谢!

标签: bash unix terminal


【解决方案1】:

你需要评估你构造的表达式,例如

$ 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 的总和,文件顺序是大括号扩展名。 唯一的缺点是它会跳过空文件。

【讨论】:

  • 我不能使用 seq 来选择文件并将它们作为我的命令的输入。但是 eval 用 ls 来完成这项工作。然而,似乎 eval 干扰了我的 awk 命令......但无论如何,这是我所期待的答案。谢谢!
  • 看看你是否可以使用 awk 模板来替换你的 bash 脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多