2016-04-08 12 views
4

Ich habe ein Verzeichnis, in dem die Dateien von Interesse Übereinstimmung mit diesem Ausdruck:Wie kann ich einen Befehl über Stapel von Dateien ausführen?

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 

ich je einen Befehl über 12 Chargen von 8 Dateien ausgeführt werden soll. So habe ich dieses Skript:

#!/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 

Leider ist dies nicht, weil der Arbeits {a $ .. $ b} wird als String und nicht als Folge interpretiert zu werden. So bekomme ich diese Fehler ...

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 

Wie kann ich {$ a .. $ b} auf eine Weise ausdrücken, die als Sequenzen interpretiert werden kann? Oder zumindest, wenn Sie wissen, dass eine alternative Möglichkeit, diese Dateien in Stapeln zu trennen, auch für mich funktioniert.

Als Alternative kann ich die Dateien (oder symbolische Verknüpfungen) in verschiedene Ordner verschieben und den Befehl ausführen, dass ich

#!/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 

will ... Aber ich mag einen direkteren Weg, um lernen TU es.

Danke für Ihre Zeit.

+1

'xargs -L 12'? –

+0

klingt interessant, wie können Sie Xargs über dieses Problem implementieren? – Geparada

+0

OK, das ist cool. Mit Xargs kann ich Schleifen in Blöcken machen. Zum Beispiel kann ich 'for i in $ (ls ../ *. DXseq.txt | xargs -L 12); echo $ i; fertig '... und damit kann ich grundsätzlich dasselbe machen wie mein letzter Code, aber in ein paar Zeilen. Vielen Dank! – Geparada

Antwort

4

benötigen Sie den Ausdruck, den Sie konstruiert, zum Beispiel

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

$ a=3;b=7; eval echo {$a..$b} 
3 4 5 6 7 

jedoch zu bewerten, ist dies nicht der richtige Ansatz ist. Sie können die Werte erhalten mit seq

zum Beispiel

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

Da Sie awk verwenden, warum es nicht mit voller Leistung nutzen zu können, die meisten Probleme

zum Beispiel

beseitigen kann, eine Vorlage Lösung

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

es druckt die Summe von für einen Stapel von 8, die Dateireihenfolge ist durch geschweifte Verlängerung. Der einzige Nachteil ist, dass es die leeren Dateien überspringt.

+0

Ich kann Seq nicht verwenden, um Dateien auszuwählen und sie als eine Eingabe meines Befehls zu setzen. Aber eval macht den Job mit ls. Es scheint jedoch, dass eval mit meinem awk-Befehl interferiert ... aber wie auch immer, ich war die Antwort, die ich erwartet hatte. Vielen Dank! – Geparada

+0

sehen Sie, ob Sie die awk-Vorlage verwenden können, um Ihr Bash-Skript zu ersetzen. – karakfa

Verwandte Themen