कट कमांड के साथ एक सीमांकक के रूप में अंतरिक्ष का उपयोग करें


328

मैं cutकमांड के साथ एक सीमांकक के रूप में अंतरिक्ष का उपयोग करना चाहता हूं ।

इसके लिए मैं कौन सी वाक्य रचना का उपयोग कर सकता हूं?


42
असत्य, कट के लिए मैन पेज यह व्याख्या नहीं करता है और सामान्य तौर पर, जानकारीपूर्ण नहीं है
अंकलजीव

2
इसके अलावा, "जानकारी में कटौती" इस मामले में कोई सुधार नहीं है।
कार्डिफ स्पेस मैन

3
@ mklement0 अगर मुझे याद है, मैं तब से हटाए गए एक टिप्पणी का उत्तर दे रहा था, जो इस प्रश्न को मैन पेज में उत्तर के रूप में खारिज कर रहा था, जो मेरी राय में "असत्य" था, इसकी परवाह किए बिना एक अच्छा कारण था। या नहीं - अब, जब मैंने स्वीकार किया कि जानकारी की इस कमी का एक अच्छा कारण हो सकता है, मुझे अभी भी लगता है कि सामान्य उपयोग के उदाहरण के बिना प्रलेखन अक्सर कम से कम परेशान होता है, जब एकमुश्त बेकार नहीं होता है
अंकलज़ेव

3
@UncleZeiv मिला; स्पष्टीकरण देने के लिए धन्यवाद; इस प्रश्न में रुचि देते हुए, यह मान लेना उचित है कि manपृष्ठ पर्याप्त नहीं है। आइए एक नज़र डालें: " टैब चरित्र के बजाय फ़ील्ड सीमांकक वर्ण के रूप में -d delimउपयोग करें delim।" (BSD cut, लेकिन GNU संस्करण और POSIX कल्पना बहुत ही एक ही राज्य)। शेल का उपयोग करने के लिए cut- विशिष्ट मामला - इसलिए आपको यह जानने की आवश्यकता है कि शेल सिंटैक्स का उपयोग करते हुए तर्क के रूप में आम तौर पर अंतरिक्ष कैसे गुजरता है , जो यकीनन मैन पेज का काम नहीं है। वास्तविक दुनिया के उदाहरण हमेशा मदद करते हैं, और जीएनयू मैन पेज में उनकी कमी होती है। cut
mklement0

4
हालाँकि चयनित उत्तर तकनीकी रूप से सही है, लेकिन @ mklement0 द्वारा अधिक हाल के और व्यापक उत्तर का चयन विहित जवाब के रूप में करें ताकि यह शीर्ष पर फ़िल्टर हो जाए।
डेविड लेबॉउर

जवाबों:


367
cut -d ' ' -f 2

जहाँ 2 स्पेस-सीमांकित फ़ील्ड की फ़ील्ड संख्या है जो आप चाहते हैं।


2
क्या आप किसी विशेष वर्ण के किसी भी संख्या का उपयोग करने के लिए कटौती बता सकते हैं, जैसे कि RegEx में? किसी भी स्थान पर संख्या, उदाहरण के लिए जैसे
बजे

3
@foampile नहीं, मुझे विश्वास नहीं है कि आप कर सकते हैं।
जोनाथन हार्टले

6
आप के साथ regexes का उपयोग नहीं कर सकते हैं cut, लेकिन cutsजिसके साथ आप सभी cutसीमाओं को "ठीक" करने की कोशिश कर सकते हैं: github.com/arielf/cuts
arielf

क्या आप हर तीसरे स्थान-रहित क्षेत्र को प्राप्त कर सकते हैं? cut -d ' ' -f 3,6,9,12,15,18हर नंबर को निर्दिष्ट किए बिना पसंद है ?
मोनोकिटो

169

आमतौर पर यदि आप अंतरिक्ष को सीमांकक के रूप में उपयोग करते हैं, तो आप एक के रूप में कई रिक्त स्थान का इलाज करना चाहते हैं, क्योंकि आप रिक्त स्थान के साथ कुछ कॉलम संरेखित करने वाले कमांड के आउटपुट को पार्स करते हैं। (और उस खोज के लिए Google मुझे यहां ले जाए)

इस मामले में एक भी cutआदेश पर्याप्त नहीं है, और आपको उपयोग करने की आवश्यकता है:

tr -s ' ' | cut -d ' ' -f 2

या

awk '{print $2}'

2
जाग उदाहरण के उपयोग के लिए धन्यवाद, बस मुझे क्या चाहिए।
स्पजम

44

मौजूदा, सहायक उत्तर के पूरक के लिए; एक अलग उत्तर पोस्ट करने के लिए प्रोत्साहित करने के लिए QZ समर्थन के लिए टोपी की नोक :

दो अलग तंत्र यहां आते हैं:

  • (क) क्या cut ही सीमांकक (अंतरिक्ष, इस मामले में) की आवश्यकता है के लिए पारित -dविकल्प के लिए एक होने के लिए अलग तर्क या क्या यह संलग्न स्वीकार्य है सीधे करने के लिए -d

  • (ख) शेल को आम तौर पर पारित करने से पहले कैसे तर्क दिया जाता है।

(ए) उपयोगिताओं (जोर मेरा) के लिए पोसिक्स दिशानिर्देशों के एक उद्धरण द्वारा उत्तर दिया गया है

यदि मानक उपयोगिता का SYNOPSIS एक अनिवार्य विकल्प-तर्क के साथ एक विकल्प दिखाता है [...] एक अनुरूप अनुप्रयोग उस विकल्प और उसके विकल्प-तर्क के लिए अलग-अलग तर्क का उपयोग करेगाहालांकि , एक अनुरूप कार्यान्वयन भी वर्णों में हस्तक्षेप के बिना एक ही तर्क स्ट्रिंग में विकल्प और विकल्प-तर्क को निर्दिष्ट करने की अनुमति देगा ।

दूसरे शब्दों में: इस मामले में, क्योंकि -dविकल्प-तर्क अनिवार्य है , आप चुन सकते हैं कि क्या सीमांकक को निर्दिष्ट करना है :

  • (s) EITHER: एक अलग तर्क
  • (घ) या: एक मूल्य के रूप में सीधे जुड़ी लिए-d

आपके द्वारा चुने जाने के बाद (या) (d), यह शेल का स्ट्रिंग-शाब्दिक पार्सिंग है - (b) - जो मायने रखता है:

  • दृष्टिकोण के साथ (रों) , निम्न रूपों के सभी बराबर हैं:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • एप्रोच (डी) के साथ , निम्नलिखित सभी फॉर्म एक्विवल हैं:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

समतुल्यता को खोल के स्ट्रिंग-शाब्दिक प्रसंस्करण द्वारा समझाया गया है :

उपरोक्तcut सभी समाधान उसी स्ट्रिंग में (प्रत्येक समूह में) परिणाम के अनुसार उन्हें देखते हैं :

  • (s) : cutदेखता है -d, अपने स्वयं के तर्क के रूप में, एक अलग तर्क के बाद जिसमें एक स्पेस चार होता है - बिना उद्धरण या \उपसर्ग के!।

  • (d) : प्लस को स्पेस चार cutदेखता है - बिना उद्धरण या उपसर्ग के! - एक ही तर्क के हिस्से के रूप में ।-d \

कारण संबंधित समूहों में रूपों अंततः समान हैं दुगना, पर आधारित है कैसे खोल पार्स स्ट्रिंग शाब्दिक :

  • शेल शाब्दिक रूप से निर्दिष्ट करने की अनुमति देता है जैसा कि उद्धृत करने वाले एक तंत्र के माध्यम से होता है , जो कई रूप ले सकता है :
    • एकल-उद्धृत स्ट्रिंग्स: अंदर की सामग्री शाब्दिक रूप '...'से ली गई है और एकल तर्क बनाती है
    • डबल-उद्धृत स्ट्रिंग्स: अंदर की सामग्री "..."भी एक तर्क बनाती है, लेकिन प्रक्षेप के अधीन है (चर संदर्भ जैसे कि $var, कमांड प्रतिस्थापन ( $(...)या `...`), या अंकगणितीय विस्तार ( $(( ... ))) का विस्तार करता है ।
    • \की -quoting व्यक्ति वर्ण : एक \एकल वर्ण पूर्ववर्ती का कारण बनता है कि चरित्र एक शाब्दिक रूप में व्याख्या की जा करने के लिए।
  • कोटेशन को उद्धरण हटाने के द्वारा पूरक किया जाता है , जिसका अर्थ है कि एक बार शेल ने कमांड लाइन को पार्स कर दिया है, यह उद्धरण वर्णों को तर्कों (संलग्न या या उदाहरणों) से हटा देता है - इस प्रकार, कमांड को लागू किया जा रहा है कभी उद्धरण वर्ण नहीं देखता है'...'"..."\

36

तुम भी कह सकते हो:

cut -d\  -f 2

ध्यान दें कि बैकस्लैश के बाद दो स्थान हैं।


30
जो व्यक्ति जानता है कि '\' अगले वर्ण से बच जाता है, वह आगे क्या आया है, इस पर ध्यान देना चाहिए। अंतरिक्ष वर्णों से बचने के लिए '\' का उपयोग करना एक बहुत ही सामान्य मुहावरा है।
जोनाथन हार्टले


1
एक लिनक्स / यूनिक्स परिप्रेक्ष्य से, \ यह मेरा पहला प्रयास था और इसने काम किया। मैं मानता हूं कि इसकी तुलना में यह कम स्पष्ट है ' ', लेकिन मुझे यकीन है कि कई लोग इसे व्यवहार के आश्वासन के रूप में पढ़कर खुश हैं। बेहतर समझ के लिए, कृपया @ mklement0 की टिप्पणी नीचे देखें।
tresf

@ जोनाथनहार्टले सुधार: " स्वार्थी व्यक्ति जो जानता है कि '' अगले चरित्र से बच जाता है और मानता है कि बाकी सभी को भी यह पता है"। व्यक्तिगत परियोजनाओं के लिए यह लागू नहीं होता है, लेकिन टीम-सेटिंग में, यह धारणा एक बहुत ही खतरनाक (और संभावित रूप से महंगा) है।
एडुआर्ड निकोडी

1
@EduardNicodei ओह मैं सहमत हूँ। हम कोड के पाठकों के बारे में बात कर रहे थे ("कौन नोटिस करता है ...?"), लेखक नहीं। लेकिन यह भी, कुछ टीमों पर यह एक निश्चित स्तर की प्रवीणता के लिए ठीक है। पर्यावरण पर निर्भर करता है।
जोनाथन हार्टले

5

मैंने अभी पता लगाया है कि आप भी उपयोग कर सकते हैं "-d ":

cut "-d "

परीक्षा

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

1
वास्तव में - या '-d '
mklement0

3
ध्यान दें कि से cutकी परिप्रेक्ष्य निम्न में से सभी समान हैं: "-d ", '-d ', -d" ", -d' ', और -d\<space>: विकल्प (करने के लिए सभी प्रकार के सीधे संलग्न विकल्प तर्क (एक अंतरिक्ष) -d) और में परिणाम ठीक उसी स्ट्रिंग समय से cutउन्हें देखता है: एक ही तर्क जिसमें d
सम्‍मिलित है

1
@ mklement0 का जवाब होना चाहिए जवाब। यह इस पृष्ठ पर सबसे व्यापक है (भले ही यह एक टिप्पणी है)।
tresf

@QZSupport: मैं भावना और प्रोत्साहन की सराहना करता हूं - इसने मुझे अतिरिक्त पृष्ठभूमि जानकारी के साथ अपना जवाब पोस्ट करने के लिए प्रेरित किया है।
mklement0

1
योग्य आकर्षक खोज!
हैरी

4

यदि डेटा उदाहरण के लिए कई रिक्त स्थान है तो आप इसे आसानी से नहीं कर सकते। मैंने इसे आसान प्रसंस्करण के लिए इनपुट को सामान्य करने के लिए उपयोगी पाया है। नीचे दिए गए सामान्यीकरण के लिए sed का उपयोग करने के लिए एक चाल है।

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

3

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

scut -f='6 2 8 7' < input.file  > output.file

इसलिए उपरोक्त आदेश व्हाट्सएप पर कॉलम को तोड़ देगा और उस क्रम में (0-आधारित) कॉलस 6 2 8 7 को निकाल देगा।


0

मेरे पास एक उत्तर है (मैं कुछ भ्रमित करने वाला उत्तर स्वीकार करता हूं) जिसमें sedनियमित अभिव्यक्ति और कैप्चर समूह शामिल हैं:

  • \S* - पहला शब्द
  • \s* - सीमांकक
  • (\S*) - दूसरा शब्द - कब्जा कर लिया
  • .* - बाकी लाइन

एक के रूप में sedअभिव्यक्ति, कैप्चर समूह की जरूरत है बच गए हो सकता है, यानी \(और \)

\1रिटर्न पर कब्जा कर लिया समूह की एक कॉपी, यानी दूसरा शब्द।

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

जब आप इस उत्तर को देखते हैं, तो यह कुछ हद तक भ्रामक है, और, आप सोच सकते हैं, परेशान क्यों? खैर, मैं उम्मीद कर रहा हूँ कि कुछ, "अहा!" और एकल sedअभिव्यक्ति के साथ कुछ जटिल पाठ निष्कर्षण समस्याओं को हल करने के लिए इस पैटर्न का उपयोग करेंगे ।

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