2016-04-02 22 views
1

Ben, 3 argümanlar -t -a alır ve -s bir program - örneğin,Gnu Paralel - seçici komut uygulamaları

./Run -t 1500 -a 150000 -s filename 

7 (bir satır olarak veri ekleme Bu program sütunlar) "dosyaadı" dosyasının sonuna.

Bu iki parametrenin çıkış değerlerini t (1500,150000 [5000]) ve bir (500,600000 [500 adım]) aralığında nasıl etkilediğini öğrenmek istiyorum. Ben is ne yapıyorum Şu an itibariyle

parallel -j+0 ./Run -t {2} -a {1} :::: <(seq 500 500 600000) :::: <seq(1500 5000 15000) 

olarak parametre t parametresinin bir her değeri için sahası içerisinde süpürülür görülebilir . Bu, tüm verileri dosyaya yazdırır, tamam.

Verilerin kullanımındaki kolaylık için, her parametre a tamamlandıktan sonra dosyaya 2 boş satır eklemesini istiyorum, böylece işleme devam edebilirim. Bu, parametre a her güncellendiğinde

echo "" >> filename 

'u eklemem gerektiği anlamına gelir.

Bunu gnu ile nasıl yapabilirim? Ben de aynı dosyaya ekleme bulmak

+0

"Bu program," filename "dosyasının sonuna bir satır (7 sütun) olarak veri ekleyecektir." 2 program tam olarak aynı zamanda eklenirse ne olur? –

cevap

1

paralel korkutucu: Bunu yapmak güvenlidir belirli durumlar vardır, ama güvenli değil sooo çok durum vardır:

# Generate files with a single very long line 
parallel -j0 perl -e '\$a=\"1{}\"x10000000\;print\ \$a,\"\\n\"' '>' {} ::: {a..z} 
rm -f out.par 
# Grep for the single line in parallel - append to same file 
parallel -j0 'grep 1 >> out.par' ::: {a..z} 
# This ought to only give a single line for each letter 
# But because of race condition some lines are split into two 
parallel --tag 'grep {} out.par | wc -l' ::: {a..z} 
rm out.par 
# Do the same in serial (no race condition) 
parallel -j1 'grep 1 >> out.par' ::: {a..z} 
# Only a single line per letter 
parallel --tag 'grep {} out.par | wc -l' ::: {a..z} 
# Do the same in parallel but with serialized output (no race condition) 
parallel -j0 grep 1 ::: {a..z} > out.par 
# Only a single line per letter 
parallel --tag 'grep {} out.par | wc -l' ::: {a..z} 

Yerinde Yani eğer ilk stdout'a (standart çıktı) için çıkışa ./Run değiştirecek, böylece yapabilirsiniz:

./Run -t 1500 -2 500 > filename 
# And in parallel: 
parallel ./Run -t {2} -2 {1} :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename 

biz kabul etmek gerek baştaki soru çözmek için, o emir önemi var: Bu kabul edilemez işler çıktı ise tamamen rastgele sırayla. Bu nedenle --keep-order (-k) 'a ihtiyacımız var.

parallel -k ./Run -t {2} -2 {1} :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename 

Şimdi sadece ilk parametre 11500 ise sadece çalışır bir şey yapmak gerekir: Sana Bunun için gerekenler emin değilim

parallel -k './Run -t {2} -2 {1}; if [ {2} -eq 11500 ]; then echo "";fi' :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename 

, ancak bir göz atmak isteyebilirsiniz --tag sizin için yararlı olabilir.