2011-10-01 10 views
30

पर पैरामीटर के रूप में संसाधित करें मेरे पास कुछ गंदा काम है, इसलिए एक बैश स्क्रिप्ट एक अच्छी पसंद प्रतीत होती है। मैं बैश के लिए नया हूं, और अनुभव मुझे निराशाजनक बनाता है।बैश: फ़ाइल लाइन-बाय-लाइन पढ़ें और प्रत्येक सेगमेंट को अन्य प्रोग्रा

फ़ाइल mapfiles.txt में निम्नानुसार रेखाएं शामिल हैं। प्रत्येक पंक्ति में एक सफेद स्थान से अलग चार सेगमेंट होते हैं। प्रत्येक सेगमेंट बाहरी प्रोग्राम नाम 'प्रोग' में इनपुट पैरामीटर का प्रतिनिधित्व करता है। उदाहरण के लिए, "cm19_1.png" फ़ाइल नाम, "0001" सूचकांक, "121,422,481" देशांतर, और "31,035,995" अक्षांश है।

फ़ाइल: mapfiles.txt

cm19_1.png 0001 121422481 31035995 
cm19_2.png 0002 121423224 31035995 
cm19_3.png 0003 121423967 31035995 
… 

मैं प्रत्येक पंक्ति के समान आदेश पर अमल करना चाहते हैं। जैसा कि नीचे दिखाया गया है, प्रोग के इनपुट पैरामीटर ऑर्डर थोड़ा अलग है। तो बार-बार काम को संभालने के लिए एक बैश स्क्रिप्ट लिखना समझ में आता है।

[Usage] prog <index> <longitude> <latitude> <filename> 
example: prog 0001 121422481 31035995 cm19_1.png 

आम तौर पर, बैश स्क्रिप्ट इस तरह से काम करेगा: खंडों

  1. पढ़ें एक mapfiles.txt
  2. स्प्लिट से लाइन
  3. कॉल एक सही पैरामीटर आदेश के साथ prog

यहां run.sh.

#!/bin/sh 

input=mapfiles.txt 
cmd=prog 

while read line 
do 
     file=$(echo $line | cut -d' ' -f1) 
     key=$(echo $line | cut -d' ' -f2) 
     log=$(echo $line | cut -d' ' -f3) 
     lat=$(echo $line | cut -d' ' -f4) 
     echo $cmd $key $log $lat $file 
done < "$input" 

मैं क्या उम्मीद

prog 0001 121422481 31035995 cm19_1.png 
prog 0002 121423224 31035995 cm19_2.png 
prog 0003 121423967 31035995 cm19_3.png 
… 

है वास्तविक परिणाम मुझे मिल गया

cm19_1.png21422481 31035995 
cm19_2.png21423224 31035995 
cm19_3.png21423967 31035995 

समस्याएं है कि मुझे उलझन में है

  1. जहाँ 'prog' है?
  2. सफेद जगह कहां है?
  3. पैरामीटर आदेश में क्या गलत है?

हम्म ... मैंने इस मैक को अपने मैक पर विम का उपयोग करके लिखा और इसे एक वैज्ञानिक लिनक्स बॉक्स और एक gentoo बॉक्स में कॉपी किया। इन तीनों लोगों को एक ही हास्यास्पद आउटपुट मिलता है।

+1

यहाँ प्रतिलिपि प्रस्तुत करने योग्य नहीं है। टाइपो के लिए देखो। इसके अलावा, सभी कटों के बजाय बस 'फ़ाइल कुंजी लॉग लैट' पढ़ें। * यूपीडी * जवाब देखें। –

+0

लूप में एसएसएच के साथ संयुक्त होने पर, इस प्रश्न पर एक नज़र डालें: http://stackoverflow.com/questions/9393038/ssh-breaks-out-of-while-loop-in-bash – Christian

उत्तर

42

आप इस एक बहुत आसान बनाने में कर सकते हैं:

while read file key log lat 
do 
    echo "$cmd" "$key" "$log" "$lat" "$file" 
done < "$input" 
+0

क्या एक अच्छी और सुरुचिपूर्ण चाल है । –

+6

आप इसे और भी सरल बना सकते हैं। आपको प्रत्येक तर्क के लिए अलग-अलग चर की आवश्यकता नहीं है: 'पढ़ने के दौरान लाइन; $ cmd $ लाइन echo करते हैं; किया <"$ इनपुट" ' – Idelic

2

prog गायब हो गए हैं सकता है, क्योंकि $cmd निर्यात नहीं कर रहा है।/Bin/sh का आपका संस्करण while कथन को एक अलग खोल में निष्पादित कर सकता है। यह मामला नहीं होना चाहिए, और यह मेरे बैश की स्थापना के मामले में नहीं है, लेकिन शायद इस विभाग में आपका दिलचस्प तरीका है।

UPD मुझे लगता है कि आपके पास कई बॉक्स हैं जो एक ही परिणाम देते हैं। यह सबहेल सिद्धांत असंभव बनाता है। शायद आपके स्क्रिप्ट और/या स्रोत फ़ाइल में कुछ मज़ेदार पात्र हैं।

मैंने आपकी स्क्रिप्ट और आपकी स्रोत फ़ाइल को मेरे gentoo बॉक्स में कॉपी और पेस्ट किया है और यह अपेक्षित परिणाम देता है। शायद आपको वही करना चाहिए, और फ़ाइलों को अपने मूल लोगों से तुलना करना चाहिए।

+2

बहुत बहुत धन्यवाद। आपकी टिप्पणी मुझे यह जानने में मदद करती है कि वास्तव में क्या गलत है। यह बैश स्क्रिप्ट नहीं है - मैं इसे तीन अलग-अलग बक्से पर परीक्षण करता हूं - यह mapfiles.txt है जो गलत हो जाता है। फ़ाइल विंडोज में जेनरेट की जाती है, प्रत्येक पंक्ति पर^एम के साथ समाप्त होती है।^एम को हटाने के बाद, सब कुछ ठीक हो जाता है। –

8

का उपयोग जीएनयू समानांतर आप एक पंक्ति में कर सकते हैं + आप इसे मुक्त करने के लिए समानांतर में करवा:

cat mapfile.txt | parallel --colsep '\s' prog {2} {3} {4} {1} 

घड़ी परिचय वीडियो अधिक जानने के लिए: http://www.youtube.com/watch?v=OpaiGYxkSuQ