जवाबों:
शब्द "फ़ील्ड" अक्सर ऐसे उपकरणों के साथ जुड़ा होता है जैसे cutऔर awk। यदि आप डेटा लेते हैं और विशिष्ट वर्ण का उपयोग करके इसे अलग करते हैं, तो एक फ़ील्ड डेटा के लायक स्तंभ के समान होगा। आमतौर पर ऐसा करने के लिए इस्तेमाल किया जाने वाला चरित्र ए है Space।
हालाँकि जैसा कि अधिकांश उपकरणों के मामले में है, यह विन्यास योग्य है। उदाहरण के लिए:
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.
इस स्विच के संबंध में, यह केवल 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,।
POSIX के अनुसार एक फ़ील्ड IFS" इनपुट फ़ील्ड सेपरेटर (या आंतरिक फ़ील्ड सेपरेटर ) " में से किसी भी वर्ण द्वारा सीमांकित लाइन का कोई भी हिस्सा है । "इस का डिफ़ॉल्ट मान अंतरिक्ष है, इसके बाद एक क्षैतिज सारणी है, जिसके बाद एक नई रेखा है। । बैश के साथ आप printf '%q\n' "$IFS"इसका मूल्य देख सकते हैं ।
cutजिसके द्वारा पूछा गया प्रश्न था।
cut -d "$IFS"त्रुटि होगी, जबकि awk -F"[ \t\n]"अपेक्षित रूप से काम करता है
यह प्रश्न में उपयोगिता पर निर्भर करता है, लेकिन इसके लिए cut, एक "फ़ील्ड" पाठ की एक पंक्ति की शुरुआत में शुरू होता है, और इसमें पहले टैब तक सब कुछ शामिल है। दूसरा फ़ील्ड पहले टैब के बाद, अगले टैब तक वर्ण से चलता है। और इसलिए तीसरे, चौथे, के लिए ... टैब के बीच या स्टार्ट-ऑफ-लाइन और टैब के बीच या टैब और एंड-ऑफ़-लाइन के बीच सब कुछ।
जब तक आप "-d" विकल्प के साथ एक फ़ील्ड सीमांकक निर्दिष्ट नहीं करते हैं: cut -d: -f2आपको पहले और दूसरे बृहदान्त्र (':') वर्णों के बीच सब कुछ मिलेगा।
अन्य उपयोगिताओं की अलग-अलग परिभाषाएं हैं, लेकिन एक टैब-चरित्र आम है। awkयदि cutबहुत सख्त है, तो एक अच्छी गिरावट है, क्योंकि awkएक या एक से अधिक व्हाट्सएप वर्णों के आधार पर फ़ील्ड्स को विभाजित करता है। यह बहुत अधिक स्थितियों में थोड़ा अधिक स्वाभाविक है, लेकिन आपको थोड़ा सा वाक्यविन्यास जानना होगा। इसके अनुसार दूसरा क्षेत्र प्रिंट करने के लिए awk:
awk '{print $2}'
sortवह है जो मुझे चकरा देता है। मेरा वर्तमान sortमैन पेज एक फील्ड सेपरेटर के लिए "नॉन-ब्लैंक टू ब्लैंक ट्रांजैक्शन" जैसा कुछ कहता है। कुछ कारणों से sortखेतों को सही ढंग से परिभाषित करने के लिए कुछ प्रयास किए जाते हैं । joinजाहिरा तौर पर "व्हाट्सएप द्वारा व्हाट्सएप" क्षेत्रों का उपयोग करता है, जो कि awkडिफ़ॉल्ट रूप से करना है।
कहानी का नैतिक सावधान रहना है, और यदि आप नहीं जानते हैं तो प्रयोग करें।
शब्द "फ़ील्ड" सामान्य रूप से लिनक्स से संबंधित नहीं है, लेकिन विशिष्ट कार्यक्रमों के लिए। इसलिए cutकी तुलना में एक अलग तरह के क्षेत्र का उपयोग करता है sort।
इसके साथ cut, आप परिभाषित करते हैं कि ऑप्शन -d के साथ एक फ़ील्ड सीमांकक निर्दिष्ट करके, जो कि प्रत्येक पंक्ति में फ़ील्ड को अलग करता है, अपने आप को एक फ़ील्ड क्या है।
यदि आपका डेटा लाइनों में कॉलोनों द्वारा अलग किया जाता है, तो आप इस तरह के क्षेत्रों (या कॉलम) 2, 3 और 6 को जोड़ सकते हैं -dऔर -fप्राप्त कर सकते हैं :
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
जब आप cutकमांड का उपयोग करते हैं तो यह दो मुख्य तर्क लेता है
-d: जो सीमांकक के लिए खड़ा है
-f: जो इनपुट फ़ाइल से कट करने के लिए फ़ील्ड के लिए खड़ा है
Ex. cut - d "|" - f1, 2 input_filename
यहाँ outputपरिसीमन द्वारा अलग किया जाएगा "|" और यह इनपुट फ़ाइल से केवल 2 फ़ील्ड काट देगा
यदि आपकी फ़ाइल में निम्नलिखित पंक्तियाँ हैं
Alex|120000|Admin|1999
फिर यह 2 फ़ील्ड काट देगा जो हैं
Alex|120000
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विकल्प गलत हो जाना आसान है।
echo '$IFS' | cat -vetमें की तरह कैसे को देखने के लिए डिफ़ॉल्ट मान दिखता हैshell।