.Csv फ़ाइल से जानकारी लें और इसे निश्चित पैटर्न के बाद जोड़ें


2

मैं इस छात्र की जानकारी के साथ काम कर रहा हूँ:

name: Romeo
e_mail: letsrock@hotmail.com
Room: 0/48
street: 1/0/48

name: April
e_mail: thebestmonth@hotmail.com
Room: 0/4
street: 1/0/4

name: Julian
e_mail: julian688@gmail.com
Room: 0/2
street: 1/0/2

name: Charles
e_mail: charlesuniv@yahoo.com
Room: 0/1
street: 1/0/1

name: Chris
e_mail: todoras@hotmail.com
Room: 0/42
street: 1/0/42

name: Richard
e_mail: richiisfun@gmail.com
Room: 0/6
street: 1/0/6

मेरे पास यह .csv फ़ाइल भी है:

id,name,e_mail
st0001, Romeo, letsrock@hotmail.com
st0002, Julian, julian688@gmail.com
st0003, Chris, todoras@hotmail.com
st0004, Richard, richiisfun@gmail.com

मैं .csv फ़ाइल से आईडी लेना चाहता हूं और इसे .dat फ़ाइल में इस तरह जोड़ता हूं:

name: Romeo
e_mail: letsrock@hotmail.com
Room: 0/48
street: 1/0/48
id: st0001    

name: April
e_mail: thebestmonth@hotmail.com
Room: 0/4
street: 1/0/4

name: Julian
e_mail: julian688@gmail.com
Room: 0/2
street: 1/0/2
id: st0002

name: Charles
e_mail: charlesuniv@yahoo.com
Room: 0/1
street: 1/0/1

name: Chris
e_mail: todoras@hotmail.com
Room: 0/42
street: 1/0/42
id: st0003

name: Richard
e_mail: richiisfun@gmail.com
Room: 0/6
street: 1/0/6
id: st0004

अब तक मैंने यह कोशिश की है:

#!/bin/bash

    FILE1=students.dat
    FILE2=table.csv

    while read line; do
        if [[ $line == name* ]]; then
            echo -e "\n$line"
            expectIp=1
        elif [[ $line == *e_mail* && $expectIp -eq 1 ]]; then
            sed 's/^\s*//' <<< $line
            unset expectIp
        elif [[ $line == Room* ]]; then
            Room=$(echo $line | grep -o 'Room[^,]*,' | sed 's/,//')
            echo $Room
            echo $line | grep -o 'street*'
            justRoom=$(echo $Room | sed 's/Room: //')
            grep -A1 \"$justRoom\" $FILE2 | grep -o 'id'
        fi
    done < $FILE1

अंतिम स्क्रिप्ट में बहुत सारी त्रुटियां हैं।

मैंने पाया है कि .csv फ़ाइल से आईडी कैसे प्राप्त करें:

grep  "richiisfun@gmail.com" students.csv | awk -F "\"*,\"*" '{print $1}'

मैं इसे स्वचालित रूप से .dat फ़ाइल में कैसे जोड़ सकता हूं?

जवाबों:


2
perl -F',\s+' -lane '
   @ARGV and $h{$F[1]}=$F[0],next;

   /^name:\s+(\S+)/ && exists $h{$a=$1} .. /^$/ || eof and do{
      /^$/ || eof and $_ .= (/^$/ ? $, : $\) . ("id: " . $h{$a} // "") . (eof ? $, : $\);
   };

   print;
' table.csv students.dat

व्याख्या

Perl विकल्प

  • -F फील्ड सेपरेटर के लिए सेट किया गया है ,\s+
  • -l आउटपुट रिकॉर्ड विभाजक के लिए सेट किया गया है \n
  • -aऑटोसप्लिट मोड => सरणी @Fमें फ़ील्ड शामिल हैं$1,$2,...,$NF
  • -n लाइनों के + निहित रीडिन से पूछे जाने पर ही प्रिंट करें, a.la., awk

तर्क

  • तर्कों का क्रम .csv फ़ाइल तब .dat फ़ाइल है।
  • @ARGV and => जब विचाराधीन इनपुट फ़ाइल .csv, otw .dat है
  • .Csv फ़ाइल डेटा से, नाम और मान के रूप में कुंजियों के साथ हैश% h पॉप्युलेट करें।
  • अब जब हम .dat फ़ाइल को प्रोसेस करने के लिए आते हैं तो एक्शन कहाँ होता है
  • में Perl, condition1 .. condition2एक फ्लिप-फ्लॉप ऑपरेटर है, a.la., ,का sed। लेकिन यह अधिक बहुमुखी है, इस अर्थ में, हम ..इनपुट में अधिक शर्तें जोड़ सकते हैं । विशेष रूप से, हमारे मामले में, /^name:\s+(\S+)/ && $h{$a=$1}एक समग्र के लिए बनाता है cond1कि जब रेखा नाम से शुरू होती है: उसके बाद कई व्हाट्सएप और फिर छात्र का नाम कैप्चर किया जाता है और $ h {$ a = $ 1} परीक्षण करता है कि क्या इस छात्र का नाम TRUE मान के साथ मिला है । (NB: so => ​​अगर ID एक शून्य होगी तो यह यात्रा हो जाएगी!)। flip-flopऑपरेटर सच रहता है एक बार यह कदम उठाया गया है और हम उस पर रख जब तक हम एक खाली पंक्ति देख सकते हैं या हम मारा EOF। इस विशेष चरण में हम $_हैश से आईडी डेटा के साथ वर्तमान लाइन को भरते हैं।

चेतावनी: कोष्ठक के बिना "ईओएफ" का उपयोग अस्पष्ट रेखा पर है। 5. का उपयोग? पैटर्न? बिना स्पष्ट ऑपरेटर को -e लाइन में पदावनत किया जाता है। खोज पैटर्न-टर्म लाइन में खोज पैटर्न के रूप में समाप्त नहीं किया गया या टर्नेरी ऑपरेटर नहीं खोजा गया है। टर्मिनल आउटपुट में मुझे जो मिला है।
सेसर विलेगास

यह पर्ल 5, संस्करण 18, तोड़फोड़ 2 (v5.18.2) x86_64-linux-gnu-thread-multi (44 पंजीकृत पैच के साथ, अधिक विस्तार के लिए perl -V देखें) के लिए बनाया गया है
सीजर वर्गस

बहुत बहुत धन्यवाद!! यह पूरी तरह से काम करता है जैसा कि @StephenRauch ने कहा कि मैं कोड को समझना चाहूंगा। मैं इसे खोजूंगा।
सीजर विलेगास

2
@ केसरविल्स: उत्तर के लिए एक व्याख्यात्मक नोट जोड़ा गया।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.