जवाबों:
शब्द "फ़ील्ड" अक्सर ऐसे उपकरणों के साथ जुड़ा होता है जैसे 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
।