Toplu iş iki dosya kümesini işleme


3

İki dosya grubum olduğunu varsayalım foo_A_uid.barve foo_B_uid.bar. Her set (bilinen) sayıda dosya içerir. Şimdi, karşılık gelen çiftleri bir takım kullanarak işlem yapmak istiyorum ( ImageMagickbenim durumumda), yani çalıştırmak istiyorum , takım çiftte çalıştırıldığında sonuç / çıktı some_command foo_A_i.bar foo_B_i.bar out_i.barnerede ve bazılarını düzeltmek için .out_i.barfoo_A_i.barfoo_B_i.bari

Sorum şu: bu süreci nasıl toplulaştırabilirim? Bazı python, bashkomut dosyası?

Açıklama: Dosyaları kümesi ile kastediyorum ki, hepsi aynı başlangıç, sonra bir kısmı UID ve aynı uzantıya sahip olan bir dosya listesi. Bu hem giriş setleri hem de çıkış için geçerlidir.


1
"Dosya setleri" derken, dosya listelerini içeren metin dosyalarını mı kastediyorsunuz? Öyleyse "foo_A_i.bar", "foo_A_i.bar dosyasındaki ith satırı" anlamına mı geliyor? Bu durumda, iki dosyayı yan yana birleştirmek için unix "paste" komutunu kullanabilirsiniz. Demek istediğin bu değilse, anlamıyorum.
Paul Richter

"Dosya grubu" derken iki setim var, her biri aynı sayıda dosya içeriyor. Kümelerden birinin her elemanı bir dosyadır - .pngbenim durumumda.
Dror

Bu dosyalar ne kadardır? Her iki isim listesi de kolayca RAM'e sığacak mı? Boşlukları ve sekme, satır besleme, sayfa besleme vb. Gibi olağandışı karakterleri içeren dosya adları var mı?
kullanıcı bilinmeyen

Benim durumumdaki dosyalar ikili dosyadır ...
Dror

Kafam karıştı, çünkü 'foo_A_uid.bar' dosya adlarını içeren bir metin dosyası (sanırım öyle olduğunu) veya örneğin dosyaları içeren bir dizin olup olmadığına karar verdiniz. Hedef dosya için bir "set" ve "image_A_01.png" için 'file_list_A.txt' gibi bir ad kullanılması çok daha açıktır
Paul Richter

Yanıtlar:


1

İşte işe yarayan bir çözüm, iyi bir çözüm olup olmadığını bilmeme rağmen.

#!/bin/bash

EXPECTED_ARGS=3
E_BADARGS=65

if [ $# -ne $EXPECTED_ARGS ]
then
    echo Not the right number of arguments
    exit $E_BADARGS
fi

for i in $( ls $1* ); do
    TMP=$(echo $2$(echo $i | cut -d'_' -f2))
    TMP2=$(echo $3$(echo $i | cut -d'_' -f2))
    convert $i $TMP +append $TMP2
done

Çalıştırmak gibi bir şey olmalı:

script foo_A_ foo_B_ out_

0
#!/bin/bash
count=$(wc -l foo_A_uid.bar)
for line in $(seq 1 ${count/ */})
do
    aline=$(sed -n $line"p" foo_A_uid.bar)
    bline=$(sed -n $line"p" foo_A_uid.bar)
    yourcommand "$aline" "$bline"
done

Her iki dosyanın sıralandığını varsayarsak, count-line get, a dosyasındaki satır sayısını gösterir. Sonra bir döngü 1..count'tan itibaren tüm değerlerin üzerinden geçer. Count değişkeni, kesilen dosyanın adını içerir ${count/ */}. Sed ile her iki dosyadan da aynı satırı alırsınız. -n 'varsayılan olarak yazdırma yok' anlamına gelir, $ line "p" satır sonra $ line yazacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.