2016-04-08 5 views
4

У меня есть каталог, в котором файлы, представляющие интерес матча с этим выражением:Как я могу запустить команду по партиям файлов?

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 

К сожалению, это не работает, потому что {$ а .. $ Ь} становится интерпретируется как строка, а не как последовательность. Поэтому я получаю эти ошибки ...

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

'xargs -L 12'? –

+0

звучит интересно, как вы можете реализовать xargs по этой проблеме? – Geparada

+0

ОК, это круто. С xargs я могу сделать для циклов в кусках. Например, я могу сделать для i в $ (ls ../*.DEXseq.txt | xargs -L 12); do echo $ i; done '... и с этим я могу в принципе сделать то же самое, что и мой последний код, но в нескольких строках. Благодаря! – Geparada

ответ

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, порядок файлов - по расширению скобки. Единственный недостаток - это пропустить пустые файлы.

+0

Я не могу использовать seq для выбора файлов, которые помещают их в качестве ввода моей команды. Но Эваль справляется с работой. Однако кажется, что eval вмешивается в мою команду awk ... но в любом случае я был тем ответом, которого ожидал. Благодаря! – Geparada

+0

Посмотрите, можете ли вы использовать шаблон awk для замены своего скрипта bash. – karakfa

Смежные вопросы