पंक्ति से स्तंभ में कैसे परिवर्तित करें?


11

मेरे पास इस तरह की (समान पंक्ति पर) आदेशित संख्या के साथ एक .txt फ़ाइल है:

106849_01373    106849_01967    106850_00082    23025.7_01059   

मैं उन्हें इस तरह बदलना चाहता हूं:

106849_01373
106849_01967
106850_00082
23025.7_01059

मुझे पता नहीं है कि किस कमांड का उपयोग करना है। क्या कोई मेरी इस बारे में मदद कर सकता है?

जवाबों:


5

यहाँ एक के साथ है xargs

xargs -n1 < file.txt

डेमो:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs एक महान उपकरण है, और यदि आपने इसका उल्लेख नहीं किया है, तो मेरे पास होगा, लेकिन इसमें एक दोष यह है कि यदि आप कमांड को छोड़ते हैं तो यह प्रतिध्वनित करता है (जो कि कुछ गोले के विपरीत है, xargs में एक अंतर्निहित गूंज नहीं है) -n1 xargs को हर arg के लिए कमांड को कॉल करने के लिए कहता है, इसलिए इस उदाहरण के साथ आपकी न्यूनतम छह प्रक्रियाएँ होंगी (शेल को io रीडायरेक्शन, xargs और चार इकोस करने के लिए)। यह इस दायरे में इतना बुरा नहीं है, लेकिन यह औसतन कुछ हज़ार लाइनों के उत्पादन में धीमा है।
hildred

16

बहुत आसान के साथ tr:

tr -s '[:blank:]' '\n' <file.txt

उदाहरण:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

हेमायल का उत्तर जाने का रास्ता है, हालांकि यहां पर्ल का उपयोग कर एक विकल्प है:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: स्वचालित लाइन-एंड प्रोसेसिंग को सक्षम करता है। इसके दो अलग-अलग प्रभाव हैं। सबसे पहले, यह स्वचालित रूप से $ / (इनपुट रिकॉर्ड सेपरेटर) को -n या -p के साथ उपयोग करने पर chomps करता है। दूसरा, यह ऑक्टनम का मूल्य रखने के लिए $ \ (आउटपुट रिकॉर्ड सेपरेटर) प्रदान करता है ताकि किसी भी प्रिंट स्टेटमेंट में उस विभाजक को वापस जोड़ा जा सके। यदि ऑक्टनम को छोड़ दिया जाता है, तो $ / को $ / के वर्तमान मूल्य पर सेट किया जाता है।
  • -a: -n या -p के साथ उपयोग किए जाने पर ऑटोसप्लिट मोड को चालू करता है। @F सरणी के लिए एक अंतर्निहित विभाजन कमांड -n या -p द्वारा निर्मित लूप जबकि निहित के अंदर पहली चीज के रूप में किया जाता है।
  • -n: पर्ल आपके प्रोग्राम के चारों ओर निम्नलिखित लूप को ग्रहण करने का कारण बनता है, जो इसे फ़ाइल नाम तर्कों पर कुछ हद तक sed -n और awk की तरह बनाता है:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: कार्यक्रम की एक पंक्ति में प्रवेश करने के लिए इस्तेमाल किया जा सकता है;

  • $,="\n": आउटपुट फ़ील्ड विभाजक को एक नई रेखा पर सेट करता है;
  • print(@F): आउटपुट फ़ील्ड विभाजक द्वारा अलग किए गए फ़ील्ड को प्रिंट करता है।
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKदृष्टिकोण। मूल रूप से खेतों और लूपिंग के लिए आउटपुट विभाजक को बदलना। परीक्षण फ़ाइल आपके उदाहरण के अंत में ENDLINE के साथ बार-बार चिपकाई जाती है

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

का उपयोग कर sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

बिलकुल नहीं..यह एक प्रारंभिक (प्रत्येक) लाइन के बाद एक नई रूपरेखा जोड़ देगा ..
heemayl

कई पंक्तियों के साथ जांच करें, तो आपको एक स्पष्ट मामला मिलेगा ..
हेमायल

क्या आप अपने उत्तर के साथ एक उदाहरण जोड़ सकते हैं ..
heemayl

@ हेम्यल का मतलब था कि यह अनुगामी स्थानों को नई सुर्खियों में बदल देगा। आपका सिंटैक्स समझने में आसान नहीं बनाता है। : /
टेक्राफ

1

मैं सिर्फ मनोरंजन के लिए एक पायथन समाधान जोड़ता हूं:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

यह कमांड एक सिंगल-पायथन 3 स्क्रिप्ट को 'सिंगल कोट्स' में फाइल नाम के साथ चलाता है जिसे आप अंत में तर्क के रूप में बदलना चाहते हैं। वाक्य रचना इस प्रकार है:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

हमारे द्वारा उपयोग की जाने वाली 1-लाइन-स्क्रिप्ट यह है (स्पष्टता के लिए कई लाइनों तक विस्तारित):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

यह sysकमांड-लाइन तर्कों को पढ़ने के लिए मॉड्यूल को आयात करता है, फ़ाइल के नाम के रूप में पहला दिया गया तर्क खोलता है और प्रत्येक व्हाट्सएप को डेटा चंक को एक लाइन में फ़ाइल से अलग करके प्रिंट करता है।

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.