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.