कट कमांड के लिए एक 'फील्ड' क्या है?


16

उदाहरण के लिए, cutकमांड एक पैरामीटर -f ले सकता है, जो के अनुसारman

केवल इन क्षेत्रों का चयन करें; किसी भी लाइन को प्रिंट करें जिसमें कोई सीमांकक वर्ण नहीं है, जब तक कि -s विकल्प निर्दिष्ट नहीं किया जाता है

इस संदर्भ में, एक क्षेत्र क्या है?

जवाबों:


19

शब्द "फ़ील्ड" अक्सर ऐसे उपकरणों के साथ जुड़ा होता है जैसे cutऔर awk। यदि आप डेटा लेते हैं और विशिष्ट वर्ण का उपयोग करके इसे अलग करते हैं, तो एक फ़ील्ड डेटा के लायक स्तंभ के समान होगा। आमतौर पर ऐसा करने के लिए इस्तेमाल किया जाने वाला चरित्र ए है Space

हालाँकि जैसा कि अधिकांश उपकरणों के मामले में है, यह विन्यास योग्य है। उदाहरण के लिए:

  • awk = awk -F"," ...- अल्पविराम (यानी ,) द्वारा अलग होगा ।
  • कट = cut -d"," ...- कॉमा (यानी ,) द्वारा अलग होगा ।

उदाहरण

यह पहले दिखाता है कि awkस्वचालित रूप से रिक्त स्थान पर कैसे विभाजित होगा।

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

यह दिखाता है कि cutरिक्त स्थान पर भी विभाजन कैसे होगा।

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

यहां हमारे पास कॉलम डेटा की एक CSV सूची है जिसका उपयोग हम cutकॉलम 1 और 4 को वापस करने के लिए कर रहे हैं ।

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

अवाक भी ऐसा कर सकते हैं:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

विभिन्न प्रकार के पृथक्करण वर्णों से निपटने में भी Awk थोड़ा अधिक निपुण है। यह उसी समय Tabsके साथ काम कर रहा है Spacesजहां वे एक ही समय में परस्पर-मिश्रित होते हैं:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

कट के बारे में -s स्विच के बारे में क्या?

इस स्विच के संबंध में, यह केवल cutउन पंक्तियों को नहीं छापना है जो -dस्विच के माध्यम से निर्दिष्ट सीमांकक वर्ण को शामिल नहीं करते हैं ।

उदाहरण

कहो कि हमारे पास यह फाइल थी।

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

नोट: ऊपर 2 वें स्ट्रिंग में रिक्त स्थान और टैब हैं।

अब जब हम स्विच के cutसाथ और उसके बिना इन तारों को संसाधित करते हैं -s:

$ cut -d" " -f1-6 sample.txt 
This is a space string.
This is a space  
Thisstringcontainsneither.

$ cut -d" " -f1-6 -s sample.txt 
This is a space string.
This is a space  

2 उदाहरण में आप देख सकते हैं कि -sस्विच ने आउटपुट से किसी भी तार को छोड़ दिया है जिसमें सीमांकक शामिल नहीं है Space,।


8

POSIX के अनुसार एक फ़ील्ड IFS" इनपुट फ़ील्ड सेपरेटर (या आंतरिक फ़ील्ड सेपरेटर ) " में से किसी भी वर्ण द्वारा सीमांकित लाइन का कोई भी हिस्सा है "इस का डिफ़ॉल्ट मान अंतरिक्ष है, इसके बाद एक क्षैतिज सारणी है, जिसके बाद एक नई रेखा है। । बैश के साथ आप printf '%q\n' "$IFS"इसका मूल्य देख सकते हैं ।


एक है echo '$IFS' | cat -vet में की तरह कैसे को देखने के लिए डिफ़ॉल्ट मान दिखता है shell
C0deDaedalus

1
IFS का उपयोग अधिकांश उद्देश्यों के लिए शेल द्वारा किया जाता है (सभी नहीं), लेकिन अन्य कार्यक्रमों द्वारा नहीं और विशेष रूप से नहीं cutजिसके द्वारा पूछा गया प्रश्न था।
dave_thompson_085

Awk के विपरीत, कट भी एक समय में केवल एक सीमांकक का समर्थन करता है, इसलिए cut -d "$IFS"त्रुटि होगी, जबकि awk -F"[ \t\n]"अपेक्षित रूप से काम करता है
JGurtz

2

यह प्रश्न में उपयोगिता पर निर्भर करता है, लेकिन इसके लिए cut, एक "फ़ील्ड" पाठ की एक पंक्ति की शुरुआत में शुरू होता है, और इसमें पहले टैब तक सब कुछ शामिल है। दूसरा फ़ील्ड पहले टैब के बाद, अगले टैब तक वर्ण से चलता है। और इसलिए तीसरे, चौथे, के लिए ... टैब के बीच या स्टार्ट-ऑफ-लाइन और टैब के बीच या टैब और एंड-ऑफ़-लाइन के बीच सब कुछ।

जब तक आप "-d" विकल्प के साथ एक फ़ील्ड सीमांकक निर्दिष्ट नहीं करते हैं: cut -d: -f2आपको पहले और दूसरे बृहदान्त्र (':') वर्णों के बीच सब कुछ मिलेगा।

अन्य उपयोगिताओं की अलग-अलग परिभाषाएं हैं, लेकिन एक टैब-चरित्र आम है। awkयदि cutबहुत सख्त है, तो एक अच्छी गिरावट है, क्योंकि awkएक या एक से अधिक व्हाट्सएप वर्णों के आधार पर फ़ील्ड्स को विभाजित करता है। यह बहुत अधिक स्थितियों में थोड़ा अधिक स्वाभाविक है, लेकिन आपको थोड़ा सा वाक्यविन्यास जानना होगा। इसके अनुसार दूसरा क्षेत्र प्रिंट करने के लिए awk:

awk '{print $2}'

sortवह है जो मुझे चकरा देता है। मेरा वर्तमान sortमैन पेज एक फील्ड सेपरेटर के लिए "नॉन-ब्लैंक टू ब्लैंक ट्रांजैक्शन" जैसा कुछ कहता है। कुछ कारणों से sortखेतों को सही ढंग से परिभाषित करने के लिए कुछ प्रयास किए जाते हैं । joinजाहिरा तौर पर "व्हाट्सएप द्वारा व्हाट्सएप" क्षेत्रों का उपयोग करता है, जो कि awkडिफ़ॉल्ट रूप से करना है।

कहानी का नैतिक सावधान रहना है, और यदि आप नहीं जानते हैं तो प्रयोग करें।


2

शब्द "फ़ील्ड" सामान्य रूप से लिनक्स से संबंधित नहीं है, लेकिन विशिष्ट कार्यक्रमों के लिए। इसलिए cutकी तुलना में एक अलग तरह के क्षेत्र का उपयोग करता है sort

इसके साथ cut, आप परिभाषित करते हैं कि ऑप्शन -d के साथ एक फ़ील्ड सीमांकक निर्दिष्ट करके, जो कि प्रत्येक पंक्ति में फ़ील्ड को अलग करता है, अपने आप को एक फ़ील्ड क्या है।

यदि आपका डेटा लाइनों में कॉलोनों द्वारा अलग किया जाता है, तो आप इस तरह के क्षेत्रों (या कॉलम) 2, 3 और 6 को जोड़ सकते हैं -dऔर -fप्राप्त कर सकते हैं :

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

जब आप cutकमांड का उपयोग करते हैं तो यह दो मुख्य तर्क लेता है

-d: जो सीमांकक के लिए खड़ा है

-f: जो इनपुट फ़ाइल से कट करने के लिए फ़ील्ड के लिए खड़ा है

Ex. cut - d "|"  - f1, 2 input_filename

यहाँ outputपरिसीमन द्वारा अलग किया जाएगा "|" और यह इनपुट फ़ाइल से केवल 2 फ़ील्ड काट देगा

यदि आपकी फ़ाइल में निम्नलिखित पंक्तियाँ हैं

Alex|120000|Admin|1999

फिर यह 2 फ़ील्ड काट देगा जो हैं

Alex|120000

गलत स्थानों के कारण आपका उदाहरण पूरी तरह से टूट गया है, और भले ही यह सही हो, 4 साल पहले दिए गए उत्तरों के लिए कुछ भी नहीं जोड़ता है।
dave_thompson_085

0

cutसाधारण मामलों के लिए बहुत अच्छा है, जहां सीमांकक एक एकल चरित्र है और आप इनपुट फ़ील्ड के सबसेट को उसी क्रम में आउटपुट करना चाहते हैं (भले ही मैं निर्दिष्ट -f3,2,1करता हूं , यह उसी तरह कार्य करता है -f1,2,3)।

awkएक-लाइनर बहुत अधिक लचीले होते हैं, उदाहरण के लिए जब इनपुट फ़ील्ड विभाजक कोई व्हाट्सएप ( awk's डिफ़ॉल्ट) हो सकता है , या जब आप फ़ील्ड को एक अलग क्रम में या किसी विशेष प्रारूप के साथ आउटपुट करना चाहते हैं।

उदाहरण के लिए wc -l myfile | awk '{print $1}'या ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'बहुत सरल हैं, लेकिन ऐसा करना मुश्किल होगा cut

मैं पहले के पोस्टरों से सहमत हूं कि फ़ील्ड / कुंजियों sortका पता लगाना कठिन है! joinलगता है के रूप में के रूप में काम करने के लिए फ़ील्ड में cut, हालांकि joinविकल्प गलत हो जाना आसान है।

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