मैं टैब और स्थानों पर परिसीमन करने के लिए कॉलम का उपयोग कैसे कर सकता हूं?


58

मैं columnकुछ पाठ को प्रारूपित करने के लिए यूनिक्स कमांड का उपयोग करना चाहूंगा । मेरे पास टैब द्वारा सीमांकित फ़ील्ड हैं, लेकिन प्रत्येक फ़ील्ड के भीतर रिक्त स्थान भी हैं। columnसफेद स्थान (टैब और स्थान) पर परिसीमन। मैं कॉलम को केवल सीमांकक के रूप में टैब का उपयोग कैसे कर सकता हूं?

मैं टैब का उपयोग करके सीमांकक के रूप में निर्दिष्ट करने की कोशिश कर रहा था:

cat myfile | column -t -s"\t"

जवाबों:


81
column -t -s '\t'

वर्णों \और स्तंभों को अलग कर देगा t

column -s \tcolumn -s tजैसा कि बैकस्लैश को शेल द्वारा संचालक के रूप में व्याख्या किया जाता है , वैसा ही है ।

यहां आप कॉलम में एक वास्तविक TAB कैरेक्टर पास करना चाहते हैं। Ksh93, zsh, bash, mksh, busybox sh या FreeBSD sh के साथ:

column -ts $'\t'

या Ctrl-V Tabशेल प्रॉम्प्ट पर टाइप करके या एक बैकस्लैश के पहले एक वास्तविक टैब कैरेक्टर डालें। क्योंकि टैब कैरेक्टर स्पेस की तरह शेल सिंटैक्स में एक टोकन सेपरेटर है, या "$(printf '\t')"स्प्लिट / ग्लोब को निष्क्रिय करने के लिए आवश्यक उन दोहरे कोट्स का उपयोग करें टैब वर्ण के रूप में ऑपरेटर भी डिफ़ॉल्ट मान में होता है $IFS)।


3
मुझे column -t -s $'\t'लगता '\t'है कि बैश के रूप में लगता है कि दोनों का मतलब है \ और t, लेकिन $'\t'एक शाब्दिक टैब का मतलब है। बैश बदबू
ThorSummoner

यदि आपको POSIX अनुपालन की आवश्यकता है (स्वामी मेरी सहायता करें), तो कृपया मेरा उत्तर देखें, जो इस शानदार उत्तर पर आधारित है!
निक बुल

इस समाधान ने मेरे लिए काम किया - $'\t'टैब को सीमांकक बनाता है। लेकिन मुझे पूरा यकीन है कि मैं awk -F "\t"जाग के लिए एक सीमांकक के रूप में एक टैब का उपयोग करता हूं । वह काम क्यों करता है और कॉलम के लिए यहाँ नहीं है?
माइक

3

मैंने निम्नलिखित का उपयोग किया (केवल अगर आपके पाठ में काम नहीं है |):

cat myfile | tr '\t' '|' | column -t -s '|'

यह सिर्फ पाइप के साथ टैब की जगह लेता है, फिर सीमांकक के रूप में पाइप के साथ कॉलम का उपयोग करता है।

(मैंने ऐसा इसलिए किया क्योंकि मैंने स्टीफन के जवाब में ऐसा कुछ नहीं देखा जो मछली के खोल में बाहर काम करता हो। अन्यथा, स्टीफन का जवाब अच्छा लगता है।)


3

पोसिक्स के लिए, $'...'जिसे एएनएसआई-सी से बचने के रूप में जाना जाता है, परिभाषित नहीं है।

इसके बजाय, आप उपयोग कर सकते हैं $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')उपयोग किया जा सकता है, जैसे कि 011(दशमलव 9 का अष्टक प्रतिनिधित्व) एक क्षैतिज टैब वर्ण के लिए ANSI कोड है:

column -t -s "$(printf '\011')"

हालाँकि स्टीफन चेज़लस के नीचे टिप्पणी देखें कि यह शेल संस्करणों के अनुरूप क्यों नहीं हो सकता है।


2
ध्यान दें कि POSIX निर्दिष्ट नहीं करता है कि TAB की एन्कोडिंग क्या है। अभी भी POSIX सिस्टम हैं जिनकी C लोकेल एन्कोडिंग EBCDIC आधारित है जहाँ TAB 5 है, ASCII में 9 की तरह नहीं। जहां भी संभव हो, इस तरह के मुद्दे से बचने के लिए नाम से वर्णों को संदर्भित करना बेहतर है "$(printf '\t')"जैसा कि मेरे उत्तर में दिखाया गया है। ध्यान दें कि $'...'POSIX विनिर्देश के अगले प्रमुख संस्करण में शामिल किए जाने की योजना है।
स्टीफन चेज़लस

@ स्टीफनचैलेजस $(printf '\t')POSIX है? धन्यवाद!
निक बुल


@ स्टीफनचेज़ेलस आपका बहुत बहुत धन्यवाद, मैंने अपना उत्तर अपडेट करने में आपकी बहुत मददगार टिप को शामिल करने के लिए :) :)
Nick Bull

2

-tस्तंभ की संख्या का चयन करने के लिए है। इस रिक्त को छोड़ने से कुछ भी नहीं बदलता है। इसके अलावा, आप सफ़ेद स्थान चाहते हैं, -sइसलिए इसे आज़माएं:

cat myfile | column -s \t


धन्यवाद। यह वह चीज है जो मैं खोज रहा हूं। हालाँकि, अब सभी लाइनें एक लाइन में विलीन हो जाती हैं। मैं प्रत्येक लाइन को अपनी लाइन पर कैसे रख सकता हूं?
कछुए

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