खोज…
परिचय
cut
कमांड पाठ फ़ाइलों की लाइनों के हिस्सों को निकालने का एक तेज़ तरीका है। यह सबसे पुराने यूनिक्स कमांड्स से संबंधित है। इसके सबसे लोकप्रिय कार्यान्वयन लिनक्स पर पाए जाने वाले GNU संस्करण और MacOS पर पाए जाने वाले FreeBSD संस्करण हैं, लेकिन यूनिक्स के प्रत्येक स्वाद का अपना एक अलग स्वाद है। मतभेद के लिए नीचे देखें। इनपुट लाइनों को या तो stdin
या कमांड लाइन पर तर्कों के रूप में सूचीबद्ध फाइलों से पढ़ा जाता है।
वाक्य - विन्यास
कट -f1,3 # पहला और तीसरा टैब-सीमांकित फ़ील्ड (स्टड से) निकालें
पहले से तीसरे क्षेत्र तक कट -f1-3 # अर्क (समाप्त होता है)
कट -फ -3 # -3 को 1-3 के रूप में व्याख्या की गई है
cut -f2- # 2- की व्याख्या दूसरे से अंतिम तक की जाती है
कट -c1-5,10 # 1,2,3,4,5,10 पदों पर वर्णों को हटाने से # अर्क
कट -s -f1 # दबाने वाली रेखाएं जिनमें सीमांकक नहीं हैं
cut --complement -f3 # (GNU कट केवल) तीसरे को छोड़कर सभी फ़ील्ड निकालें
पैरामीटर
पैरामीटर | विवरण |
---|---|
-फ, - फील्ड्स | क्षेत्र-आधारित चयन |
-d, - डेलिमिटर | क्षेत्र-आधारित चयन के लिए परिसीमन |
-सी, --चैकर्स | चरित्र-आधारित चयन, सीमांकक त्रुटि या त्रुटि |
-s, - अकेला-सीमांकित | बिना किसी सीमांकक वर्ण वाली लाइनों को दबाएं (जैसा कि अन्यथा मुद्रित है) |
--पूरक हैं | उल्टे चयन (निर्दिष्ट फ़ील्ड / वर्णों को छोड़कर सभी को निकालें) |
--output-सीमांकक | निर्दिष्ट करें कि इसे इनपुट सीमांकक से अलग कब होना है |
टिप्पणियों
1. वाक्य भेद
उपरोक्त तालिका में लंबे विकल्प केवल GNU संस्करण द्वारा समर्थित हैं।
2. किसी भी पात्र को विशेष उपचार नहीं मिलता
FreeBSD cut
(जो MacOS के साथ आता है, उदाहरण के लिए) में --complement
स्विच नहीं है, और, वर्ण श्रेणियों के मामले में, कोई इसके बजाय colrm
कमांड का उपयोग कर सकता है:
$ cut --complement -c3-5 <<<"123456789"
126789
$ colrm 3 5 <<<"123456789"
126789
हालाँकि, एक बड़ा अंतर है, क्योंकि colrm
टीएबी पात्रों (एएससीआईआई 9) को आठ के अगले कई तक वास्तविक सारणी के रूप में मानते हैं, और बैकस्पेस (एएससीआईआई 8) -1 के रूप में; इसके विपरीत, cut
सभी वर्णों को एक स्तंभ चौड़ा मानते हैं।
$ colrm 3 8 <<<$'12\tABCDEF' # Input string has an embedded TAB
12ABCDEF
$ cut --complement -c3-8 <<<$'12\tABCDEF'
12F
3. (अभी भी नहीं) अंतर्राष्ट्रीयकरण
जब cut
डिजाइन किया गया था, सभी वर्ण एक बाइट लंबे थे और अंतर्राष्ट्रीयकरण कोई समस्या नहीं थी। जब व्यापक वर्णों के साथ लेखन प्रणाली लोकप्रिय हो गई, तो POSIX द्वारा अपनाया गया समाधान पुराने -c
स्विच के बीच डिट्टुइश करना था, जो कि पात्रों के चयन के अपने अर्थ को बनाए रखना चाहिए , चाहे कितने भी बाइट्स चौड़े हों, और एक नया स्विच- -b
शुरू करना चाहिए वर्तमान वर्ण एन्कोडिंग के बावजूद , बाइट्स का चयन करें। अधिकांश लोकप्रिय कार्यान्वयनों में, -b
को पेश किया गया था और काम करता है, लेकिन -c
अभी भी ठीक उसी तरह काम कर रहा है जैसे -b
और जैसा कि उसे नहीं करना चाहिए। जीएनयू cut
साथ उदाहरण के लिए:
ऐसा लगता है कि एसई का स्पैम फिल्टर अंग्रेजी ग्रंथों को अलग-थलग कर देता है और उनमें अलग-अलग कांजी अक्षर हैं। मैं इस सीमा को पार नहीं कर सका, इसलिए निम्नलिखित उदाहरण कम अभिव्यंजक हैं जितना वे हो सकते हैं।
# In an encoding where each character in the input string is three bytes wide,
# Selecting bytes 1-6 yields the first two characters (correct)
$ LC_ALL=ja_JP.UTF-8 cut -b1-6 kanji.utf-8.txt
...first two characters of each line...
# Selecting all three characters with the -c switch doesn’t work.
# It behaves like -b, contrary to documentation.
$ LC_ALL=ja_JP.UTF-8 cut -c1-3 kanji.utf-8.txt
...first character of each line...
# In this case, an illegal UTF-8 string is produced.
# The -n switch would prevent this, if implemented.
$ LC_ALL=ja_JP.UTF-8 cut -n -c2 kanji.utf-8.txt
...second byte, which is an illegal UTF-8 sequence...
यदि आपके पात्र ASCII सीमा से बाहर हैं और आप cut
का उपयोग करना चाहते हैं, तो आपको हमेशा अपने एन्कोडिंग और उपयोग -b
अनुसार वर्ण चौड़ाई के बारे में पता होना चाहिए। यदि और जब -c
प्रलेखित के रूप में काम करना शुरू करता है, तो आपको अपनी लिपियों को बदलना नहीं पड़ेगा।
4. गति तुलना
cut
की सीमाओं के लोगों को इसकी उपयोगिता पर संदेह है। वास्तव में, समान कार्यक्षमता अधिक शक्तिशाली, अधिक लोकप्रिय उपयोगिताओं द्वारा प्राप्त की जा सकती है। हालांकि, cut
का फायदा इसकी परफॉर्मेंस है । कुछ गति तुलना के लिए नीचे देखें। test.txt
में तीन मिलियन लाइनें हैं, जिनमें से प्रत्येक में पांच अलग-अलग क्षेत्र हैं। awk
परीक्षण के लिए, mawk
का उपयोग किया गया था, क्योंकि यह GNU awk
से तेज है। शेल स्वयं (अंतिम पंक्ति) अब तक का सबसे खराब प्रदर्शन है। दिए गए समय (सेकंड में) वास्तविक समय के रूप में जो time
कमांड देता है।
(गलतफहमी से बचने के लिए: सभी परीक्षण किए गए आदेशों ने दिए गए इनपुट के साथ एक ही आउटपुट दिया, लेकिन वे निश्चित रूप से समकक्ष नहीं हैं और विभिन्न स्थितियों में अलग-अलग आउटपुट देंगे, विशेष रूप से यदि फ़ील्ड रिक्त स्थान की एक चर संख्या द्वारा सीमांकित किए गए थे)
आदेश | समय |
---|---|
cut -d ' ' -f1,2 test.txt | 1.138s |
awk '{print $1 $2}' test.txt | 1.688s |
join -a1 -o1.1,1.2 test.txt /dev/null | 1.767s |
perl -lane 'print "@F[1,2]"' test.txt | 11.390s |
grep -o '^\([^ ]*\) \([^ ]*\)' test.txt | 22.925s |
sed -e 's/^\([^ ]*\) \([^ ]*\).*$/\1 \2/' test.txt | 52.122s |
while read ab _; do echo $a $b; done <test.txt | 55.582s |
5. रेफरेंशियल मैन पेज
मूल उपयोग
विशिष्ट उपयोग CSV- प्रकार की फाइलों के साथ होता है, जहां प्रत्येक पंक्ति में एक सीमांकक द्वारा अलग किए गए फ़ील्ड होते हैं, जो विकल्प -d
द्वारा निर्दिष्ट होते हैं। डिफ़ॉल्ट सीमांकक TAB वर्ण है। मान लीजिए कि आपके पास लाइनों के साथ एक डेटा फ़ाइल data.txt
0 0 755 1482941948.8024
102 33 4755 1240562224.3205
1003 1 644 1219943831.2367
फिर
# extract the third space-delimited field
$ cut -d ' ' -f3 data.txt
755
4755
644
# extract the second dot-delimited field
$ cut -d. -f2 data.txt
8024
3205
2367
# extract the character range from the 20th through the 25th character
$ cut -c20-25 data.txt
948.80
056222
943831
हमेशा की तरह, एक स्विच और उसके पैरामीटर के बीच वैकल्पिक स्थान हो सकते हैं: -d,
के समान है -d ,
GNU cut
एक - --output-delimiter
विकल्प को निर्दिष्ट करने की अनुमति देता है: (इस उदाहरण की एक स्वतंत्र विशेषता यह है कि इनपुट सीमांकक के रूप में एक अर्धविराम को शेल द्वारा इसके विशेष उपचार से बचने के लिए बचना होगा)
$ cut --output-delimiter=, -d\; -f1,2 <<<"a;b;c;d"
a,b
केवल एक सीमांकक चरित्र
आपके पास एक से अधिक सीमांकक नहीं हो सकते हैं: यदि आप कुछ निर्दिष्ट करते हैं जैसे -d ",;:"
, तो कुछ कार्यान्वयन केवल पहले चरित्र को एक सीमांकक के रूप में उपयोग करेंगे (इस मामले में, अल्पविराम।) अन्य कार्यान्वयन (जैसे GNU cut
)। आपको एक त्रुटि संदेश।
$ cut -d ",;:" -f2 <<<"J.Smith,1 Main Road,cell:1234567890;land:4081234567"
cut: the delimiter must be a single character
Try `cut --help' for more information.
बार-बार परिसीमन करने वालों की व्याख्या खाली खेतों के रूप में की जाती है
$ cut -d, -f1,3 <<<"a,,b,c,d,e"
a,b
बल्कि स्पष्ट है, लेकिन अंतरिक्ष-सीमांकित तारों के साथ यह कुछ के लिए कम स्पष्ट हो सकता है
$ cut -d ' ' -f1,3 <<<"a b c d e"
a b
cut
उपयोग तर्कों को पार्स करने के लिए नहीं किया जा सकता है क्योंकि शेल और अन्य प्रोग्राम करते हैं।
कोई उद्धरण नहीं
सीमांकक की रक्षा के लिए कोई रास्ता नहीं है। स्प्रेडशीट और इसी तरह के सीएसवी-हैंडलिंग सॉफ्टवेयर आमतौर पर एक टेक्स्ट-कोटिंग कैरेक्टर को पहचान सकते हैं, जो कि एक सीमांकक वाले तारों को परिभाषित करना संभव बनाता है। cut
साथ आप नहीं कर सकते।
$ cut -d, -f3 <<<'John,Smith,"1, Main Street"'
"1
निकालना, जोड़ तोड़ नहीं
आप केवल रेखाओं के अंश निकाल सकते हैं, न कि पुन: क्रमबद्ध करने या फ़ील्ड को दोहराने के लिए।
$ cut -d, -f2,1 <<<'John,Smith,USA' ## Just like -f1,2
John,Smith
$ cut -d, -f2,2 <<<'John,Smith,USA' ## Just like -f2
Smith