2011-01-25 15 views
7

मैं मान $dates की एक सरणी है कि मैं कर रहा हूँ बदलने है:यूनिक्स नक्शा समारोह

for i in $dates 
do 
    date -d "1970-01-01 $i sec UTC" '+%a_%D' 
done 

वहाँ तो मैं कुछ करने के लिए पाइप यह कर सकते हैं इस आपरेशन के परिणाम को बचाने के लिए एक तरह से किसी और एक करने के लिए इसे लिखने के बिना है डिस्क पर फ़ाइल?

+2

क्या आप बाश तक सीमित हैं? यदि नहीं, तो मैं इसे पर्ल में करने की सलाह दूंगा ... नक्शा पैकेज के हिस्से के रूप में आता है। – DVK

+0

आपकी सरणी कितनी बड़ी है? 10s, 100s, 1000s, बड़ा? डिस्क पर इसे क्यों नहीं लिखा जा सकता है? क्या आप परिणाम किसी अन्य सरणी में रख सकते हैं? क्यों नहीं? –

+0

क्या आपका दिनांक 'दिनांक' का समर्थन 'date -d" @ $ i "'+% a_% डी' है? –

उत्तर

6

एक समारोह बनाएँ:

foo() { 
     for i in [email protected] 
     do 
       date -d "1970-01-01 $i sec UTC" '+%a_%D' 
     done 
} 

तो फिर तुम जैसे कर सकते हैं मानक त्रुटि के लिए उत्पादन भेजें:

echo `foo $dates` >&2 
+0

मानक त्रुटि में आउटपुट भेजने के लिए आपके लिए क्या करता है? आप बिना किसी फ़ंक्शन के ऐसा कर सकते हैं: 'के लिए ... किया गया> और 2'। –

+0

@ डेनिस विलियमसन: यह आउटपुट को stderr भेजने के बारे में नहीं है; यह केवल एक उदाहरण था कि फ़ंक्शन का उपयोग कैसे करें। यह लंबी अभिव्यक्तियों के साथ गड़बड़ किए बिना आउटपुट को कैप्चर करने में सक्षम होने के बारे में है, जैसे कि $ $ (मेरे लिए $ तिथियों में, दिनांक-डी "@ $ i" '+% a_% डी'; किया गया) हर समय। – Oswald

+0

आसपास के '$ (...)' आवश्यक नहीं हैं। डेनिस ने दिखाए गए हैं कि आप पूरे 'के लिए' पाइप कर सकते हैं। जैसा कि किया गया है ... 2-command'। – Adrian

2

आप इसे एक फीफो - एक "नामित पाइप" लिख सकते हैं जो फ़ाइल की तरह दिखता है।

विकिपीडिया इसके उपयोग के एक सभ्य उदाहरण है: http://en.wikipedia.org/wiki/Named_pipe

+0

नामित पाइप वास्तव में दिलचस्प हैं, धन्यवाद! हालांकि, मैं एक डेडलॉक प्राप्त कर रहा हूं। उनके बारे में और जानने की जरूरत है। – pokerface

3

आपका प्रश्न थोड़ा अस्पष्ट है, लेकिन निम्नलिखित काम कर सकते हैं:

for ... 
do 
... 
done | ... 
1

संपादित करें, पूरी फ़ाइल बात नहीं देखा था:

for i in $dates ; do 
    date -d "1970-01-01 $i sec UTC" '+%a_%D' 
done |foo 
+0

ओप ने विशेष रूप से एक फ़ाइल में डेटा लिखना नहीं चाहते थे। –

+0

उत्तर I/O पुनर्निर्देशन के साथ उत्तर 2 का उपयोग उत्तर 1 में append-per-command के बजाय किया जाना चाहिए। –

1

बैश का उपयोग कर रहे हैं, तो आप एक सरणी इस्तेमाल कर सकते हैं:

q=0 
for i in $dates 
do 
    DATEARRAY[q]="$(date -d "1970-01-01 $i sec UTC" '+%a_%D')" 
    let "q += 1" 
done 

फिर आप किसी अन्य प्रोग्राम में उस सरणी को गूंज/पाइप कर सकते हैं। ध्यान दें कि सरणी बाश विशिष्ट हैं, जिसका अर्थ यह है कि यह एक पोर्टेबल नहीं है (ठीक है, सिस्टम के बाहर है जो समाधान है) समाधान।

+0

आपको '$()' के अंदर उद्धरणों से बचने की आवश्यकता नहीं है। उनका मूल्यांकन बाहर से बाहर से अलग किया जाता है। वास्तव में, इस मामले में यह काम नहीं करेगा। आप 'array + = (element)' कर सकते हैं और आपको इंडेक्स वैरिएबल का ट्रैक रखने की आवश्यकता नहीं है। –

+0

अधिकांश गोले में Arrays मौजूद हैं, और वे लगभग उसी वाक्यविन्यास के साथ पहले सीएसएच में थे ('DATEARRAY [q] = ... 'सेट करें)। –

+0

@ डेनिस - धन्यवाद, मैंने वास्तव में उन्हें बाद में विचार के रूप में जोड़ा। @ चार्ल्स, मुझे नहीं लगता कि वे डैश, क्ष, पीडीकेश या व्यस्त बॉक्स में मौजूद हैं (जो मूल रूप से डैश आईआईआरसी है), इसलिए पोर्टेबिलिटी के लिए चेतावनी। यह जानना साफ है कि वे पहले सीएसएच में थे, जिन्हें मैं _nearly_ पर्याप्त उपयोग नहीं करता :) –

11

जब से तुम कहते हैं कि "बदलने" मैं तुम्हें मतलब है कि आप एक चर में पाश के उत्पादन पर कब्जा करना चाहते हैं यह सोचते हैं रहा हूँ। आप अपने $dates चर की सामग्री को भी प्रतिस्थापित कर सकते हैं।

dates=$(for i in $dates; do date -d "@$i" '+%a_%D'; done) 
+0

मैं इस से प्रेरित था और 'आशीर्वाद $ (मैं {0..127} में; प्रिंटफ' 0x% 06x '$ (($ i * 0x4000)) किया;) कई फाइलें खोलने के लिए '0x000000, 0x004000 , 0x008000, 0x00c000, 0x010000, 0x014000, ... एक बार तार्किक क्रम में। –

संबंधित मुद्दे