Unix शेल स्क्रिप्ट में रिक्त स्थान के साथ तार को कैसे पैड करें?


3

मेरे पास डेटा है जो इस तरह दिखता है:

01234567
09876544
12345676
34576980

मुझे इसे 11 स्थानों के साथ पैड करने की आवश्यकता है यानी मेरे आउटपुट को इस तरह दिखना चाहिए:

'           01234567' 
'           09876544'
'           12345676'
'           34576980'

मैं UNIX शेल स्क्रिप्टिंग का उपयोग कैसे कर सकता हूं?


1
क्या आपका इनपुट शाब्दिक रूप से एक पंक्ति में दिखता है? कितने खेत हैं? केवल दो या अधिक? क्या यह एक पाठ फ़ाइल में है, और क्या एक से अधिक लाइनें हैं? उद्धरण और अल्पविराम के बीच अंतर के बारे में क्या, वे भी डाला जा सकता है? यदि आप कहते हैं कि यूनिक्स का अर्थ है यूनिक्स, कड़ाई से, या लिनक्स भी? क्या स्क्रिप्टिंग भाषा? बैश ठीक है, या अन्य? कृप्या संपादित करें और अपने प्रश्न को स्पष्ट करें। शायद आप हमें पृष्ठभूमि के बारे में अधिक बता सकते हैं, क्योंकि आप जो पूछ रहे हैं वह थोड़ा विपरीत लगता है।
slhck

1
आपके द्वारा संपादित किए जाने के बाद आपकी पोस्ट कैसी दिखेगी, इसका एक लाइव पूर्वावलोकन है। कृपया इसका उपयोग करें।
Daniel Beck

जवाबों:


10

मैं मान रहा हूं / अनुमान लगा रहा हूं कि एपोस्ट्रोफ को आउटपुट में शामिल नहीं किया जाना चाहिए।

मानक शेल समाधान, जहां infile इनपुट वाली फाइल है:

while read i; do printf "%19s\n" "$i"; done < infile

कहा पे 19 स्ट्रिंग की लंबाई प्रति पंक्ति है क्योंकि उन्हें (8) प्लस वांटेड पैडिंग (11) दिया गया है। मैं फिर से अनुमान लगा रहा हूं कि इस तरह की पैडिंग आप चाहते हैं, और सभी लाइनों के लिए केवल 11 रिक्त स्थान नहीं दिखा रहे हैं। यदि यह मामला नहीं है, तो आपको एक विशिष्ट उदाहरण देने की आवश्यकता है कि अलग-अलग लंबाई की इनपुट पंक्तियों को कैसे संभाला जाना चाहिए।

यदि प्रेरितों को शामिल किया जाना था:

while read i; do printf "'%19s'\n" "$i"; done < infile

3

GNU कोरुटिल्स से एक छोटा विकल्प है pr आदेश:

pr -T -o 11 foo.txt

मैन पेज से अंश:

DESCRIPTION
       Paginate or columnate FILE(s) for printing.

       -o, --indent=MARGIN
              offset each line with MARGIN (zero) spaces

       -T, --omit-pagination
              omit page headers and trailers, eliminate any pagination by form feeds set in input files

0

आप एक्स-एडिटर (वीआई) का उपयोग कर सकते हैं, या तो फ़ाइल को इन-प्लेस में बदलकर:

ex -s +"%s@^@    @" -cwq foo.txt

या मानक इनपुट पार्स करके और इसे मानक आउटपुट में प्रिंट करें:

cat foo.txt | ex -s +"%s@^@    @" +%p -cq! /dev/stdin

0

मान लें कि डेटा एक पाठ फ़ाइल में है:

    $ cat file.txt 
    01234567
    09876544
    12345676
    34576980

निम्नानुसार सेड कमांड या पर्ल वन-लाइनर का उपयोग करें:

    $ sed -n "s#^\(.*\)#\'           \1\'#p" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

-n :    By default, each line of input is echoed to the standard output after 
        all of the commands have been applied to it.  The -n option suppresses
        this behavior.
 p :    Print the current pattern space.


    $ perl -p -e "s#^(.*)#\'           \$1\'#" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

−p: Assumes an input loop around the script. Lines are printed.
−e commandline:
May be used to enter a single line of script. Multiple −e commands
build up a multiline script.

मैंने उबंटू लिनक्स पर इन कमांड की कोशिश की है।


-1

यह @ डैनियल एंडरसन के जवाब की आपूर्ति है, यदि किसी फ़ाइल से पढ़ी गई प्रत्येक पंक्ति की लंबाई भिन्न होती है, तो आप निम्न कार्य कर सकते हैं:

while read i; do printf "%11s%s\n" "" "$i"; done < infile

अल्पविराम क्यों है?
confetti

कृपया कुछ स्पष्टीकरण जोड़ें (अन्य उत्तरों की तुलना करें)।
Scott

@Scott, डैनियल एंडर्सन का जवाब मानता है कि फ़ाइल की प्रत्येक पंक्ति की लंबाई (8 अंक) समान है, इसलिए वह% 19s का उपयोग करता है, यदि लंबाई भिन्न होती है, तो हम% 11s% s का उपयोग कर सकते हैं, है ना?
Tony Guo

@confetti क्षमा करें, यह एक टाइपो है, उत्तर अपडेट किया गया है
Tony Guo

जब "पैडिंग" का संदर्भ दिया जाता है, तो आमतौर पर आउटपुट एक निश्चित चौड़ाई होना चाहता है। जैसे 19 अक्षर। यदि इनपुट उस से कम है, तो आउटपुट की वांछित वर्ण लंबाई प्राप्त करने के लिए इनपुट में बाईं ओर (या दाएं) में "पैडिंग" आमतौर पर एक स्थान (या 0, या जो कुछ) को जोड़ने को संदर्भित करता है।
confetti
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.