स्वचालित रूप से इनपुट फ़ाइलों के आधार पर असेंबल का नाम आउटपुट


0

मेरे पास चैनल में अलग की गई छवियों वाला एक फ़ोल्डर है:

IMAGE_A_R.jpg
IMAGE_A_G.jpg
IMAGE_A_B.jpg
IMAGE_A_RGB.jpg
IMAGE_A1_R.jpg
IMAGE_A1_G.jpg
IMAGE_A1_B.jpg
IMAGE_A1_RGB.jpg
IMAGE_B_R.jpg
IMAGE_B_G.jpg
IMAGE_B_B.jpg
IMAGE_B_RGB.jpg

अब मैं क्या कर रहा हूँ असेंबल और नामकरण का उपयोग कर 4x1 चित्र बना रहा है तो "OUTPUT_% d.jpg"। हालाँकि, यह मुझे मैन्युअल रूप से उदाहरण के लिए "IMAGE_A.jpg" में उनका नाम बदलने के लिए मजबूर करता है, जो इस बड़ी छवि संग्रह के लिए बहुत समय लेने वाला है।

मैं जो करना चाहता हूं, वह स्वचालित रूप से है, ऊपर दी गई सूची से 4x1 नाम का नाम बनाएं:

IMAGE_A.jpg
IMAGE_A1.jpg
IMAGE_B.jpg

आदर्श रूप से, मैं स्वचालित रूप से सभी "IMAGE_A" को 4x असेंबल में, सभी "IMAGE_B" को एक दूसरे में और इतने पर संयोजित करना चाहूंगा। प्रत्येक IMAGE_ [अक्षर] 1-4 संख्याओं से हो सकता है इसलिए केवल 4x2 असेंबल उदाहरण के लिए बनाना संभव नहीं है।

मैंने बिना किसी भाग्य के% [नाम] और% f का उपयोग करने की कोशिश की है और ImageMagick मैनुअल या मेरी Google खोजों में कुछ भी उपयोगी नहीं पाया है।

मुझे संदेह है कि ऐसा करने के लिए मुझे कुछ BASH- स्क्रिप्ट का उपयोग करना होगा, लेकिन मुझे डर है कि मुझे मदद के बिना ऐसा करने के लिए थोड़ा ज्ञान होना चाहिए।

किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद!

जवाबों:


1

सबसे पहले, छवि नामों की सूची एकत्र करें:

ls *jpg | gawk -F_ '{print $2}' | sort | uniq

अब, उन्हें पास करें montage:

ls *jpg | gawk -F_ '{print $2}' | sort | uniq | 
 while read n; do montage *\_$n\_* IMAGE_$n.jpg; done

यह मानता है कि आपके फ़ाइल नामों में कोई रिक्त स्थान या अन्य अजीब अक्षर नहीं हैं। मुझे आपके "आदर्श" मामले पर यकीन नहीं है। यदि आप अपने "आदर्श" आउटपुट को दिखाने के लिए सवाल अपडेट करते हैं, तो मुझे आपके लिए कुछ काम करने में सक्षम होना चाहिए।


अद्यतन करें:

यह मैंने लिखा एक छोटी सी पर्ल स्क्रिप्ट को वह करना चाहिए जो आपको चाहिए:

#!/usr/bin/env perl

my %k;             ## declare the hash that will store the image names
while(<>){         ## loop through STDIN
    chomp;         ## remove newline (\n)
    @a=split(/_/); ## split the line on '_' and save as array @a

    ###################################################
    # Since the image names can have varying numbers  #
    # of "_", we want to use the penultimate item in  #
    # the array ($a[$#a-1]) as the image name prefix  #
    ###################################################
    $a[$#a-1]=~s/\d*//g;

    #############################################################
    # Now that we have the prefix ('A' or 'B' in your example), #
    # we will save this image name in the hash of that prefix   #
    #############################################################
    $k{$a[$#a-1]}{$_}=1;
}
## The keys of the hash '%k' are all the prefixes we have found
foreach my $prefix (keys(%k)){
    @images=keys(%{$k{$prefix}});   ## all the images with this prefix

    ## Print the montage command to be executed (testing)
    print "montage @images -title $prefix -tile 4x $prefix.jpg\n";

    ##############################################################
    # If the commands printed above are correct, uncomment this  #
    # line to execute them instead of only printing.             #
    ##############################################################
    #`montage @images -title $prefix -tile 4x $prefix.jpg`
}

आप इसे या तो foo.plजो चाहें उसे सहेज सकते हैं और इसे इस तरह से चला सकते हैं:

ls *jpg | perl foo.pl

या आप इसे एक लाइनर के रूप में चला सकते हैं:

ls *jpg | perl -e 'my %k; while(<>){chomp; @a=split(/_/); $a[$#a-1]=~s/\d*//g; $k{$a[$#a-1]}{$_}=1;} foreach my $prefix (keys(%k)){@images=keys(%{$k{$prefix}}); `montage @images -title $prefix -tile 4x $prefix.jpg`;}'

महत्वपूर्ण : यह स्क्रिप्ट बहुत सरल है और यदि आपके फ़ाइल नामों में स्थान या अन्य अजीब अक्षर हैं तो यह काम नहीं करेगा। मैं यह मान रहा हूं कि यह आपके लिए कोई समस्या नहीं है, इसे ठीक करना अपेक्षाकृत आसान है, लेकिन सिंटैक्स को चारों ओर से अधिक जटिल बना देता है।


आदर्श मामला यह होगा: फाइलें नाम की हैं [name]-[letter][number]-[channel].jpg, जहां [number]सभी छवियों पर मौजूद नहीं है (पत्र केवल छवि का अवलोकन किया जा रहा है)। आदर्श रूप में एक ही सभी चित्र [name]और [letter], प्रत्येक छवि के साथ लेबल एक ही असेंबल में होना चाहिए [channel], असेंबल एक हैडर जा रहा है होने [name]और फ़ाइल का नाम[name]-[letter].jpg
मॉर्गन

मैं जो देख सकता हूं, उसमें आपके द्वारा पोस्ट की गई कमांड केवल [letter][number]समाप्ति पर दिखती है । चूंकि सभी के लिए समान हैं [name], इसलिए यह पूरी तरह से काम नहीं करेगा। यदि आवश्यक हो, तो मैं आसानी से फ़ाइलों के नामकरण को बदल सकता हूं ताकि सभी के पास हो [number]
मॉर्गन

अपनी स्क्रिप्ट के लिए धन्यवाद, थोड़े संशोधनों के साथ, मैं लगभग वही कर पाया जो मैं चाहता हूं: ls *jpg | gawk -F_ '{print $1}' | sort | uniq | while read n; do montage $n\_* -title $n -tile 4x $n.jpg; done; हालांकि, मैं यह पता नहीं लगा सकता कि उन्हें केवल पत्र के आधार पर अलग कैसे किया जाए (ऊपर देखें)। न ही मैं यह पता लगा सकता हूं कि चैनल का नाम कैसे लाया जाए। अब, यह कम महत्व का है - और जब मैं यह जानना चाहूंगा कि मुझे यह कैसे करना है - आपने पहले ही मेरी काफी मदद की है। धन्यवाद!
मॉर्गन

@ आपका बहुत स्वागत है, मैं अभी भी पूरी तरह से स्पष्ट नहीं हूँ कि आप क्या चाहते हैं। क्या आप एक विस्तृत उदाहरण दे सकते हैं? आप सभी चाहते हैं A, A1, A2एक ही फाइल में आदि छवियों? कुछ सरल स्क्रिप्टिंग को वह करने में सक्षम होना चाहिए जो आपको चाहिए। इसके अलावा, ls *jpgयदि आप भी कर रहे हैं तो आपकी पिछली टिप्पणी बेकार है ls *HeLa*
टेराडन

वास्तव में सभी A#एक ही असेंबल में B#होना चाहिए , सभी को समान और इसी तरह होना चाहिए। उदाहरण के लिए, सभी छवियों को लेने के लिए मुझे जो कुछ भी चाहिए, वह है, उदाहरण के लिए NAME-A#, और इसी तरह का एक असेंबल बनाना NAME-B#। मैं जो निकटतम आया हूं वह करना है gawk -F_ { OFS = "_" } { print $1, $2}', लेकिन मुझे नहीं पता कि नंबर से छुटकारा कैसे पाया जाए। चूंकि उनमें से कुछ फाइलें अधिक _हैं, इसलिए मुझे यह भी आश्चर्य होता है कि क्या पीछे से गिनती करना संभव है A#, B#और इसलिए हमेशा पहले आता है _[CHANNEL]
मॉर्गन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.