2010-03-06 15 views
5

मैं एक प्रारूप से दूसरे प्रारूप में कनवर्ट करने का प्रयास कर रहा हूं: उदा। "2 9 अक्टूबर, 2005" 2005-10-29 तक। मेरे पास 625 तिथियों की एक सूची है। मैं Awk का उपयोग करें।गॉक/अजीब: पाइपिंग तिथि गेटलाइन * कभी-कभी * काम नहीं करेगा

रूपांतरण कार्य - अधिकांश समय। होवर, कभी-कभी रूपांतरण नहीं होगा, और परिवर्तनीय (परिवर्तित) तिथि धारण करने वाला चर अपरिभाषित रहता है।

यह हमेशा एक ही पंक्तियों के साथ होता है। उन अजीब पंक्तियों की तारीख पर स्पष्ट रूप से (बाश खोल से) 'दिनांक' चलाना ठीक है (तिथियां ठीक से परिवर्तित होती हैं)। - यह उन पंक्तियों की पाठ्य सामग्री नहीं है जो मायने रखती हैं।

यह व्यवहार क्यों है, और मैं अपनी स्क्रिप्ट कैसे ठीक कर सकता हूं?
उसे यह है:

  1. डाउनलोड इस फाइल: uBXr0r15.txt

    awk 'BEGIN { FS = "unused" } { 
        x = "undefined"; 
        "date \"+%Y-%m-%d\" -d " $1 | getline x ; 
        print $1 " = " x 
    }' uBXr0r15.txt \ 
    > bug-out-3.txt 
    

    आप इस समस्या को पुन: पेश करना चाहते हैं।

  2. Awk skript चलाएं।
  3. बग-आउट-3.txt में "अपरिभाषित" के लिए खोजें।
    ("अनिर्धारित", 122 बार पाया अपने कंप्यूटर पर।)

तो फिर तुम स्क्रिप्ट चलाने सकता है फिर से, और (अपने कंप्यूटर पर) बग बाहर 3.txt अपरिवर्तित रहता है - वास्तव में एक ही तारीख को अपरिभाषित छोड़ दिया गया है।

(gawk संस्करण 3.1.6, Ubuntu 9.10।)

सधन्यवाद, मैगनस

उत्तर

8

जब भी आप पढ़ने या awk में लिखने के लिए एक पाइप या फ़ाइल को खोलने, बाद पहले जाँच (एक आंतरिक हैश का उपयोग) होगा यह पहले से ही एक पाइप है कि क्या है या एक ही नाम साथ फाइल (अभी भी खुला; यदि हां, तो यह पाइप या फ़ाइल को फिर से खोलने के बजाय मौजूदा फ़ाइल डिस्क्रिप्टर का पुन: उपयोग करेगा।

आपके मामले में, undefined के रूप में समाप्त होने वाली सभी प्रविष्टियां वास्तव में डुप्लीकेट हैं; पहली बार उनका सामना करना पड़ रहा है (यानी जब संबंधित कमांड date "..." -d "..." पहले जारी किया गया है) उचित परिणाम x में पढ़ा जाता है। उसी तारीख के बाद की घटनाओं पर, getline मूल date पाइप से दूसरी, तीसरी आदि लाइनों को पढ़ने का प्रयास करता है, भले ही पाइप date द्वारा बंद कर दिया गया हो, जिसके परिणामस्वरूप x अब असाइन नहीं किया जा रहा है।

नोट::

gawk आदमी पृष्ठ से

एक पाश के भीतर एक पाइप, सह प्रक्रिया, या getline को सॉकेट, या प्रिंट या printf से का उपयोग कर रहे हैं, तो आप पास का उपयोग करना चाहिए() कमांड या सॉकेट के नए उदाहरण बनाने के लिए। एडब्ल्यूके स्वचालित रूप से बंद पाइप, सॉकेट या सह-प्रक्रिया नहीं करता है जब वे ईओएफ वापस करते हैं।

आप स्पष्ट रूप से close पाइप हर बार के बाद आप x पढ़ना चाहिए है:

close("date \"+%Y-%m-%d\" -d " $1) 

संयोग से, यह awk में पाइप से पहले sort और uniquBXr0r15.txt करने के लिए ठीक हो सकता है, या आप मूल आदेश देने की क्या ज़रूरत है/दोहराव?

+0

यह मेरी समस्या हल करता है, धन्यवाद। मुझे मूल ऑर्डरिंग की आवश्यकता नहीं है और यदि मैं अपना इंडाटा पुन: व्यवस्थित करता हूं तो समस्या भी खत्म हो जाती है - और मैं कुछ सीपीयू को मानता हूं। (असली दुनिया इंद्र में गैर-तारीख पंक्तियां भी शामिल हैं, इसलिए मैं 'सॉर्ट' और 'यूनिक' का उपयोग नहीं कर सकता, और असली Awk स्क्रिप्ट कुछ अलग है।) – KajMagnus

+0

धन्यवाद, यह मेरी समस्या हल करता है - मुझे एक त्रुटि मिल रही थी "बहुत सारी खुली फाइलें" और आश्चर्य की कि इन "फाइलों" को कैसे बंद करें क्योंकि मुझे पता नहीं था कि उन पाइप परिचालनों के लिए फ़ाइलों का अजीब उपयोग नहीं किया गया था। – flo

+0

मैंने यादृच्छिक शोध के लिए एक समारोह के बाद की कॉलिंग पर इस समस्या को देखा। –

3

हालांकि मैं प्यार AWK यह इस के लिए आवश्यक नहीं है।

tr -d '"' < uBXr0r15.txt | date +%Y-%m-%d -f -

+0

धन्यवाद, मुझे नहीं पता था कि मैं ऐसा कर सकता हूं। मेरी मूल पोस्ट में उदाहरण एक सरलीकृत उदाहरण है। मेरी असली Awk स्क्रिप्ट कुछ हद तक लंबी है, और असली इनपुट फ़ाइल में गैर-तारीख पंक्तियां भी शामिल हैं। – KajMagnus

3
gawk 'BEGIN{ 
     m=split("January|February|March|April|May|June|July|August|September|October|November|December",d,"|") 
     for(o=1;o<=m;o++){ 
      months[d[o]]=sprintf("%02d",o) 
     } 
     FS="[, ]" 
    } 
    { 
     gsub(/["]/,"",$1) 
     gsub(/["]/,"",$4) 
     t=mktime($4" "months[$1]" "$2" 0 0 0") 
     print strftime("%Y-%m-%d",t) 
    }' uBXr0r15.txt 

गॉक के अंदर सबकुछ कर बाहरी आदेशों को कॉल करने से तेज़ होगा।

+0

यह एक महत्वाकांक्षी समाधान था :-) ठीक काम करता है। मेरे लिए एक दूसरे के उन अंशों का इंतजार करना ठीक है, जबकि अन्य समाधान लेते हैं :-) – KajMagnus

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