फ़ाइल के कॉलम रूपांतरण के लिए पंक्तियाँ


15

मान लीजिए कि मेरे पास एक फाइल है:

file1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

File2 मुझे चाहिए:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

File1 के कॉलम रूपांतरण के लिए पंक्तियाँ।


यदि आपकी फ़ाइल में एक से अधिक लाइन हैं और आपके आउटपुट में एक से अधिक कॉलम होना चाहिए, तो इस AWK स्क्रिप्ट को आज़माएँ ।
अगली सूचना तक रोक दिया गया।

बहुत अधिक संबंधित प्रश्न: askubuntu.com/q/461144/295286
सर्गी कोलोडियाज़नी

जवाबों:


20

का उपयोग करके 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परिणाम में पहले कॉलम में पहली पंक्ति, दूसरी कॉलम में दूसरी पंक्ति, आदि होगा बेशक इनपुट फ़ाइल आपके मेमोरी साइज़ तक सीमित है।


मैंने एक ही डेटा और कोड के साथ प्रयास किया, इसने पिछले कॉलम को पहले रिकॉर्ड के रूप में छापा जैसे 4 डी% और फिर 2 डी रिकॉर्ड 1 ए # और इतने पर।
अभिनयन

8

आप बस grep के माध्यम से ऐसा कर सकते हैं। डिफ़ॉल्ट रूप से, एक अलग नई रेखा में मैच प्रिंट करेगा।

grep -oP '\S+' infile > outfile

या

grep -o '[^[:space:]]\+' infile > outfile

1
+1 रचनात्मक उपयोग के लिएgrep
वोल्कर सेगेल

8

आप fmtकमांड का उपयोग भी कर सकते हैं :

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

7

GNU डेटामाश के साथ :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamashइस कार्य के लिए सबसे अच्छा उपकरण की तरह लगता है, लेकिन आकर्षक है कि कितने अन्य उपकरणों का इस्तेमाल किया जा सकता है!
मार्क स्टीवर्ट

6

आप इसका उपयोग करके भी कर सकते हैं sed:

$ sed -e 's/  */\n/g' file1 > file2

नोट: उस स्थिति को नहीं संभालता है जहाँ शब्दों में रिक्तियाँ हैं।


इसके लिए जीएनयू सेड की आवश्यकता होती है, जितना कि मैं बता सकता हूं। मैक (BSD) के साथ जो जहाज चलता है वह \nनई लाइन के रूप में नहीं दिखता है
डी। बेन नोबेल

5

रिकॉर्ड (लाइन) विभाजक ( ) के रूप awkमें आउटपुट फ़ील्ड विभाजक ( OFS) का उपयोग करना , सेट करना RS:

awk '{OFS=RS;$1=$1}1' file > file2


0

आप प्रयोग करके भी देख सकते हैं sed

$ sed -i.bak s@' '@'\n'@g infile.txt

कृपया ध्यान दें कि मैं @प्रतिस्थापन संचालन के लिए एक विभाजक के रूप में उपयोग कर रहा हूं । यह एक बैकअप फ़ाइल भी बनाएगा। मामले में आपको एक बैकअप हटाने की आवश्यकता नहीं है

$ sed -i s@' '@'\n'@g infile.txt

0

पायथन संस्करण:

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

0

का उपयोग कर xargs, ( souravc के जवाब से चोरी ):

xargs -n 1 < File1 > File2

या यदि किसी भी मामूली सुधार की आवश्यकता है, तो printfप्रारूप स्ट्रिंग्स का उपयोग करें, हालांकि इसकी आवश्यकता हो सकती है:

xargs printf '%s\n' < File1 > File2


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