हेडर नाम से awk में कॉलम प्रिंट करें


12

मेरे पास एक टेक्स्ट फ़ाइल है जैसे

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma

मैं 1 और 3 जैसे कुछ कॉलम को प्रिंट करने के लिए awk का उपयोग कर सकता हूं {print $1, $3}, लेकिन मैं कॉलम के हेडर को निर्दिष्ट करके प्रिंट करने के लिए कॉलम निर्दिष्ट करना चाहता हूं, जैसे कुछ {print $foo, $baz}। यह उपयोगी है इसलिए मुझे फ़ाइल खोलने और कॉलम को मैन्युअल रूप से देखने के लिए गिनना नहीं है कि कौन सा कॉलम है, और अगर कॉलम नंबर या ऑर्डर बदलता है तो मुझे स्क्रिप्ट को अपडेट करने की आवश्यकता नहीं है। क्या मैं इसे awk (या किसी अन्य शेल टूल) के साथ कर सकता हूं?

जवाबों:


17
awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma

यह एक बेहद उपयोगी मुहावरा है। मेरे पास स्प्रेडशीट में बहुत अधिक डेटा है और अलग-अलग स्प्रेडशीट में उन कॉलमों का एक सामान्य उपसमुच्चय हो सकता है जिनकी मुझे दिलचस्पी है लेकिन जरूरी नहीं कि सभी स्प्रेडशीट भर में एक ही क्रम में या अन्य कॉलमों की समान संख्या से पहले / उनके बीच इतना निर्यात करने में सक्षम हो। उन्हें CSV या समान के रूप में और फिर स्तंभ संख्याओं के बजाय स्तंभ नामों का उपयोग करके एक awk स्क्रिप्ट को चलाने के लिए बिल्कुल अमूल्य है।


यह महान धन्यवाद है और मेरे उद्देश्यों के लिए काम करता है। क्या आप स्पष्ट करने में सक्षम हैं कि यह एक अजीब शुरुआत के लिए कैसे काम करता है? इसमें f [$ i] सिंटैक्स क्या कर रहा है, और जागरण कैसे काम करता है जो तार के मेल खाते हैं?
एलेक्स जिप

आपका स्वागत है। यह बिल्कुल बुनियादी awk सिंटैक्स है, बस awk मैन पेज (या इसे Google) में फ़ील्ड और सरणियाँ देखें। जोड़ें print iऔर print $iऔर print च [$ i] `पाश में बयान, आदि हो रहा है कि अगर मदद करता है क्या पता लगाने के लिए।
एड मॉर्टन

1

आप मांगते हैं awk, लेकिन आप इसके लिए एक अधिक विशिष्ट उपकरण का उपयोग भी कर सकते हैं csvtool:।

csvtool -t ' ' -u ' ' namedcol foo,baz file

या

csvtool -t ' ' -u ' ' col 1,3 file

1

यह मानते हुए कि फ़ाइल एक TSV ("टैब अलग मूल्य") फ़ाइल है, का उपयोग कर csvkit:

$ csvcut -t -c foo,baz file.tsv
foo,baz
1,alpha
2,beta
3,gamma

आउटपुट ठीक से CSV स्वरूपित किया जाएगा, लेकिन आसानी से TSV में वापस बदला जा सकता है:

$ csvcut -t -c foo,baz file.tsv | csvformat -T
foo     baz
1       alpha
2       beta
3       gamma

नंबर और रेंज लेने का -cविकल्प csvcut, और इनपुट डेटा के कॉलम को पुनर्व्यवस्थित करने के लिए भी इस्तेमाल किया जा सकता है (एक सुविधा जो मुझे अक्सर मानक cutउपयोगिता में याद आती है )।

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