shell - यूनिक्स में एक फ़ाइल की प्रत्येक पंक्ति के अंत में 100 रिक्त स्थान कैसे जोड़ें




unix awk (5)

मेरे पास एक फाइल है जिसमें प्रत्येक पंक्ति में 200 वर्ण शामिल होना चाहिए। मुझे प्रत्येक पंक्ति में केवल 100 वर्णों के साथ एक स्रोत फ़ाइल मिली। मुझे अब प्रत्येक पंक्ति में 100 अतिरिक्त सफेद स्थान जोड़ना होगा अगर यह कुछ रिक्त स्थान थे, तो हम इसे पसंद कर सकते थे:

 sed 's/$/     /' filename > newfilename

चूंकि यह 100 रिक्त स्थान है, क्या कोई मुझे बता सकता है कि यूनिक्स में जोड़ना संभव है?


आप awk में printf का उपयोग कर सकते हैं:

awk '{printf "%s%*.s\n", $0, 100, " "}' filename > newfile

यह printf प्रत्येक न्यूलाइन के अंत में 100 स्थानों को जोड़ देगा


बस के मामले में आप एक bash समाधान की तलाश कर रहे हैं,

while IFS=  read -r line
    do
    printf "%s%100s\n" "$line" 
done < file > newfile

परीक्षा

कहो कि मेरे पास 3 लाइनों के साथ एक फाइल है, जैसा कि यह है

$ wc -c file
      16 file
$ wc -c newfile
     316 newfile

मूल उत्तर

spaces=$(echo {1..101} | tr -d 0-9)
while read line
    do
    echo -e "${line}${spaces}\n" >> newfile
done < file

यदि आप बैश का उपयोग करते हैं, तो आप अभी भी sed का उपयोग कर सकते हैं, लेकिन आपको मैन्युअल रूप से 100 रिक्त स्थान टाइप करने से रोकने के लिए कुछ रीडलाइन कार्यक्षमता का उपयोग करें (देखें "रीडलाइन तर्क" के लिए मैनुअल )।

आप सामान्य रूप से टाइप करना शुरू करते हैं:

sed 's/$/

अब, आप 100 रिक्त स्थान सम्मिलित करना चाहते हैं आप इसे पटकथा तर्क के साथ स्पेस बार मारकर पूर्व में कर सकते हैं यह इंगित करने के लिए कि आप इसे 100 गुना करना चाहते हैं, यानी, मैन्युअल रूप से यह दर्ज करें कि यह एक रीडलाइन कीबाइंडिंग के रूप में कैसा दिखता है:

M-1 0 0 \040

या, अगर आपकी मेटा कुंजी alt कुंजी है: Alt + 1 0 0 अंतरिक्ष

यह 100 स्थानों को सम्मिलित करता है, और आपको मिलता है

sed 's/$/                                                                                                    /' filename

बाकी के आदेश टाइप करने के बाद

यह एक इंटरेक्टिव शेल में काम करने के लिए उपयोगी है, लेकिन लिपियों के लिए बहुत सुंदर नहीं है - उसके लिए अन्य समाधानों का उपयोग करें


स्ट्रिंग हेरफेर समारोह sprintf का उपयोग करते हुए GNU awk में एक और तरीका

awk 'BEGIN{s=sprintf("%-100s", "");}{print $0 s}' input-file > file-with-spaces

उदाहरण के साथ एक प्रमाण: -

$ cat input-file
1234jjj hdhyvb 1234jjj
6789mmm mddyss skjhude
khora77 koemm  sado666
nn1004  nn1004 457fffy
$ wc -c input-file
      92 input-file
$ awk 'BEGIN{s=sprintf("%-100s", "");}{print $0 s}' input-file > file-with-spaces
$ wc -c file-with-spaces
      492 file-with-spaces

ग्लेन के सुझाव के बाद अपडेट किया गया

कुछ टिप्पणियों में ग्लेन सुझाव देता है कि कैसे प्रतिस्थापन अनावश्यक है, आप केवल रिक्त स्थान जोड़ सकते हैं - यद्यपि, उस तर्क को आगे ले जाने के लिए आपको इसके अलावा की आवश्यकता नहीं है, आप केवल मूल पंक्ति के बाद उन्हें say सकते say

perl -nlE 'say $_," "x100' file

मूल उत्तर

पर्ल के साथ:

perl -pe 's/$/" " x 100/e' file

यह कहते हैं ... "अंतरिक्ष के 100 पुनरावृत्तियों की गणना की अभिव्यक्ति ( e ) के साथ प्रत्येक पंक्ति ( $ ) के अंत में विकल्प ( s )"

यदि आप सभी पंक्तियों को पैड चाहते हैं, तो कहें, 200 फाइलें भले ही इनपुट फ़ाइल खड़ी हो गई (अलग-अलग लाइनों की सभी पंक्तियां), आप इस तरह से कुछ का उपयोग कर सकते हैं:

perl -pe '$pad=200-length;s/$/" " x $pad/e'

जो 83, 102 और 1 9 7 वर्णों की लाइनों को 200 प्रत्येक के लिए बनाएगा





awk