Awk प्रोग्राम में पथ से फ़ाइल नाम निकालें


21

मेरे पास एक awk स्क्रिप्ट है और मैंने इसके लिए एक CSV फ़ाइल पास की है।

awk -f script.awk /home/abc/imp/asgd.csv

मैं जो कर रहा हूं, वह है कि आपके भीतर FILENAME पाने के लिए script.awk। FILENAME मुझे पूरा रास्ता देता है। जैसा कि मैं जाग में हूँ मैं उपयोग नहीं कर सकता basename FILENAME

print FILENAME;
/home/abc/imp/asgd.csv

मैंने इसके भीतर प्रयास किया है script.awk

echo $FILENAME | awk -F"/" '{print $NF}'

लेकिन मैं इसे अंजाम नहीं दे सकता script.awk। मैं asgd.csvजाग कार्यक्रम के भीतर कैसे प्राप्त कर सकता हूं ?

जवाबों:


33

कई विकल्प:

awk '
  function basename(file) {
    sub(".*/", "", file)
    return file
  }
  {print FILENAME, basename(FILENAME)}' /path/to/file

या:

awk '
  function basename(file, a, n) {
    n = split(file, a, "/")
    return a[n]
  }
  {print FILENAME, basename(FILENAME)}' /path/to/file

ध्यान दें कि उन क्रियान्वयनों basenameको सामान्य मामलों के लिए काम करना चाहिए, लेकिन कोने के मामलों में नहीं, जैसे basename /path/to/x///कि वे खाली स्ट्रिंग वापस लौटाते हैं xया /जहां वे खाली स्ट्रिंग वापस करते हैं /, हालांकि नियमित फ़ाइलों के लिए, ऐसा नहीं होना चाहिए।

फ़ाइल पथ (आखिरी तक /) में पहले वाले ठीक से काम नहीं करेंगे, जिसमें बाइट्स के सीक्वेंस होते हैं, जो वर्तमान लोकेल में मान्य वर्ण नहीं बनाते हैं (आम तौर पर इस तरह की बात यूटीएफ -8 स्थानों में होती है, जिसमें कुछ 8 में फिल्माया गया है। बिट सिंगल बाइट कैरेक्टर सेट)। आप उस स्थान को C के स्थान पर ठीक करके काम कर सकते हैं जहां बाइट के प्रत्येक अनुक्रम में वैध वर्ण होते हैं।


5
यदि आपको ऐसे कोड की आवश्यकता है जो किसी फ़ंक्शन को प्रस्तुत किए बिना किसी मौजूदा awk स्क्रिप्ट में आसानी से काम करेंगे, तो आपको उपयोग करना चाहिए n = split(FILENAME, a, "/"); basename=a[n];:। subउस रूप में उपयोग न करें जो वास्तव में FILENAMEचर को बदल देगा (जो कि फ़ंक्शन के साथ एक गैर-मुद्दा है क्योंकि awk मूल्य द्वारा कॉल का उपयोग करता है)।
शिरी


0

इनपुट CSV या सीधे इनपुट फ़ाइल पथ से इसे निर्यात करने का सबसे अच्छा तरीका आप इसे उल्टा कर सकते हैं, फिर 1 कॉलम प्राप्त कर सकते हैं और फिर इसे उल्टा कर सकते हैं।

function getFileFromPath() {
    FileName=$1
    cat $FileName | while read Filename
    do
        echo $Filename| rev | awk -v FS='/' '{print $1}' | rev 
    done
}

या केवल

echo $FileNamePath| rev | awk -v FS='/' '{print $1}' | rev 

0

अवाक के स्प्लिट फंक्शन का उपयोग करें

इसका एक तरीका विभाजन कार्य का उपयोग करना है। उदाहरण के लिए:

awk '{idx = split(FILENAME, parts, "/"); print parts[idx]; nextfile}' /path/to/file

यह भी कई फ़ाइलों पर काम करता है। उदाहरण के लिए:

$ awk '{idx = split(FILENAME, parts, "/"); print parts[idx]; nextfile}' \
      /etc/passwd /etc/group
passwd
group

0

सिस्टम जहां पर basenameआदेश उपलब्ध है, एक का उपयोग कर सकता awkहै system()समारोह या expression | getline varबाहरी कॉल करने के लिए संरचना basenameआदेश। यह स्टीफन के जवाब में वर्णित कोने के मामलों के लिए लेखांकन में मदद कर सकता है ।

$ awk '{cmd=sprintf("basename %s",FILENAME);cmd | getline out; print FILENAME,out; exit}' /etc///passwd
/etc///passwd passwd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.