मान लीजिए कि मेरे पास एक फाइल है:
file1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 मुझे चाहिए:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
File1 के कॉलम रूपांतरण के लिए पंक्तियाँ।
मान लीजिए कि मेरे पास एक फाइल है:
file1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 मुझे चाहिए:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
File1 के कॉलम रूपांतरण के लिए पंक्तियाँ।
जवाबों:
का उपयोग करके tr, प्रत्येक दोहराया अंतरिक्ष चरित्र ( ) को एक नई लाइन ( \n) चरित्र के साथ बदलें ।
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 #
abcd -> 2 b $
# $ @% 3 c @
4 डी%
साथ awkहम कर सकता है:
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) }
END{ for (i in RtoC) print RtoC[i] }' infile
यह एक ही दायर की गई संख्या के पॉज़िटॉन को एक साथ जोड़ देता है और ENDपरिणाम में पहले कॉलम में पहली पंक्ति, दूसरी कॉलम में दूसरी पंक्ति, आदि होगा बेशक इनपुट फ़ाइल आपके मेमोरी साइज़ तक सीमित है।
आप बस grep के माध्यम से ऐसा कर सकते हैं। डिफ़ॉल्ट रूप से, एक अलग नई रेखा में मैच प्रिंट करेगा।
grep -oP '\S+' infile > outfile
या
grep -o '[^[:space:]]\+' infile > outfile
grep
आप fmtकमांड का उपयोग भी कर सकते हैं :
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
GNU डेटामाश के साथ :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamashइस कार्य के लिए सबसे अच्छा उपकरण की तरह लगता है, लेकिन आकर्षक है कि कितने अन्य उपकरणों का इस्तेमाल किया जा सकता है!
आप इसका उपयोग करके भी कर सकते हैं sed:
$ sed -e 's/ */\n/g' file1 > file2
नोट: उस स्थिति को नहीं संभालता है जहाँ शब्दों में रिक्तियाँ हैं।
\nनई लाइन के रूप में नहीं दिखता है
रिकॉर्ड (लाइन) विभाजक ( ) के रूप awkमें आउटपुट फ़ील्ड विभाजक ( OFS) का उपयोग करना , सेट करना RS:
awk '{OFS=RS;$1=$1}1' file > file2
एक forलूप का उपयोग करना :
for val in `cat file1` ; do echo $val >> file2; done;
आप प्रयोग करके भी देख सकते हैं sed
$ sed -i.bak s@' '@'\n'@g infile.txt
कृपया ध्यान दें कि मैं @प्रतिस्थापन संचालन के लिए एक विभाजक के रूप में उपयोग कर रहा हूं । यह एक बैकअप फ़ाइल भी बनाएगा। मामले में आपको एक बैकअप हटाने की आवश्यकता नहीं है
$ sed -i s@' '@'\n'@g infile.txt
पायथन संस्करण:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
यह <पुनर्निर्देशन का उपयोग अजगर के डंडे से करता है input.txtऔर पुनर्निर्देशन का output.txtउपयोग करने के लिए लिखता है >। एक-लाइनर खुद को सभी लाइनों stdinमें स्ट्रिंग्स की एक सूची से पढ़ता है , जहां सभी रिक्त स्थान को नई लाइनों के साथ बदल दिया जाता है, और हम .join()फ़ंक्शन का उपयोग करके पूरे पाठ का पुनर्निर्माण करते हैं।
श्रृंखला में कई स्थानों से बचने के लिए वैकल्पिक दृष्टिकोण को नई .split()सूचियों के साथ प्रतिस्थापित किया जाता है ताकि शब्दों की सूची में लाइन को तोड़ने के लिए उपयोग किया जा सके। इस तरह, हम यह सुनिश्चित कर सकते हैं कि प्रत्येक शब्द केवल एक नई पंक्ति से अलग हो
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
का उपयोग कर xargs, ( souravc के जवाब से चोरी ):
xargs -n 1 < File1 > File2
या यदि किसी भी मामूली सुधार की आवश्यकता है, तो printfप्रारूप स्ट्रिंग्स का उपयोग करें, हालांकि इसकी आवश्यकता हो सकती है:
xargs printf '%s\n' < File1 > File2
मेरा समाधान होगा:
#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done