एक पंक्ति के रूप में कई लाइनों के साथ पाठ फ़ाइलों को सॉर्ट करें


14

मेरे पास इस प्रारूप में एक पाठ फ़ाइल है:

####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY3
VAL31
VAL32
VAL33
VAL34

मैं इस फ़ाइल को KEYलाइन से सॉर्ट करना चाहता हूँ और अगली 4 पंक्तियों को इसके साथ रखता हूँ ताकि परिणाम क्रमबद्ध हो:

####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34

क्या इसे करने का कोई तरीका है ?


5
कृपया पोस्ट पार न करें
Zanna

@Zanna: मुझे लगता है कि यूनिक्स और आस्कुबंटू वर्गों के लिए एक बहिष्करण है क्योंकि इन दोनों में प्रत्येक अभिभावक के साथ बहुत अधिक ओवरलैप है! मुझे लगता है कि मैं इसके बारे में यूनिक्स के मेटा सेक्शन में
पढ़ता हूं

2
प्रासंगिक प्रश्न एयू मॉड द्वारा यहां पूछा गया है :) प्रश्न उबंटू पर क्रॉस-पोस्ट कैसे किया जाना चाहिए?
ज़न्ना

@ समस्या समस्या ओवरलैप नहीं होगी, वास्तव में बहुत सी एसई साइटें ओवरलैप करती हैं, लेकिन जवाब देने वाले लोग दूसरी साइट पर उत्तर के बारे में नहीं जानते होंगे।
phk

जवाबों:


13

msort(1)बहु-रेखा रिकॉर्ड के साथ फ़ाइलों को सॉर्ट करने में सक्षम होने के लिए डिज़ाइन किया गया था। इसमें एक वैकल्पिक gui है, साथ ही एक सामान्य और प्रयोग करने योग्य मानव कमांड लाइन संस्करण भी है। (कम से कम, मनुष्य जो मैनुअल को ध्यान से पढ़ना और उदाहरण के लिए देखना पसंद करते हैं ...)

AFAICT, आप रिकॉर्ड के लिए एक मनमाना पैटर्न का उपयोग नहीं कर सकते हैं, इसलिए जब तक कि आपके रिकॉर्ड निश्चित आकार के नहीं होते (बाइट्स में, वर्ण या रेखाएं नहीं)। रिकॉर्ड के लिए msortएक -bविकल्प है जो रिक्त लाइनों द्वारा अलग की गई लाइनों के ब्लॉक हैं।

आप अपने इनपुट को एक प्रारूप में बदल सकते हैं, जो कि -bबहुत आसानी से काम करेगा , प्रत्येक के पहले एक रिक्त लाइन डालकर ###...(पहले एक को छोड़कर)।

डिफ़ॉल्ट रूप से, यह स्टैडर पर आंकड़ों को प्रिंट करता है, इसलिए कम से कम यह बताना आसान है कि यह कब सॉर्ट नहीं हुआ क्योंकि यह लगा कि पूरा इनपुट एकल रिकॉर्ड था।


msortआपके डेटा पर काम करता है। sedआदेश हर करने के लिए एक नई पंक्ति पहले जोड़ता #+लाइन 1. के अलावा लाइन -wप्रकार पूरे रिकॉर्ड (कोषगत)। एक कुंजी के रूप में उपयोग करने के लिए रिकॉर्ड के किस भाग को चुनने के लिए विकल्प हैं, लेकिन मुझे उनकी आवश्यकता नहीं थी।

मैंने एक्स्ट्रा न्यूलाइन्स को भी छोड़ दिया।

$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null 
####################################
KEY1
VAL11
VAL12
VAL13
VAL14

####################################
KEY2
VAL21
VAL22
VAL23
VAL24

####################################
KEY3
VAL31
VAL32
VAL33
VAL34

मेरे पास -r '#'रिकॉर्ड विभाजक के रूप में उपयोग करने के लिए कोई भाग्य नहीं था । यह पूरी फाइल एक रिकॉर्ड था।


आपका बहुत बहुत धन्यवाद; msortबहुत उपयोगी है; धन्यवाद (इसके बारे में -rऐसा लगता है कि यह है क्योंकि वहाँ एक से अधिक # मैं इस्तेमाल किया है -dऔर यह काम किया
RYN

ठंडा! (+1) msort -qwr '#' ex मेरे लिए काम करता है (अच्छी तरह से यह आउटपुट rec सेपरेटर का
पीछा करता है

9

एक समाधान यह है कि पहले अपनी पसंद के अप्रयुक्त चरित्र (नीचे उदाहरण में) के ब्लॉक के अंदर लाइन फीड्स को बदलें, परिणाम सॉर्ट करने के लिए और मूल लाइन फीड में चुने गए विभाजक को वापस बदलने के लिए:

sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'

1
धन्यवाद; यह काम करता है लेकिन यह विशेष रूप से गंदा है जब डेटा भी गंदा है! यदि कुंजी के बाद की रेखाएं 100 थीं, तो मुझे ;Nवहां 100 डालने की आवश्यकता है , और यह एक वर्ण ढूंढना मुश्किल हो सकता है जो पाठ में ही उपयोग नहीं किया जाता है; यह बहुत अच्छा है sortया awk, ...
बहुराष्ट्रीय

5
perl -0ne 'print sort /(#+[^#]*)/g' file.txt
  • perl -0 पूरी फाइल को खंगालता है
  • /(....)/g मिलान करें और रिकॉर्ड निकालें
  • print sort ... उन्हें क्रमबद्ध करें और प्रिंट करें

2

यहां एक और तरीका है जो किसी KEYअनुभाग में किसी भी संख्या में लाइनों के साथ काम करना चाहिए :

# extract delimiter
delim=$(head -n1 <infile)
sed '/#/d;/KEY/h;G;s/\n/\x02/' infile | nl -ba -nrz -s $'\002' | sort -t $'\002' -k3 -k1,1 |
cut -d $'\002' -f2 | sed '/KEY/{x;s/.*/'"${delim}"'/;G}'

यह सीमांकक को एक चर में सहेजकर (फिर इनपुट से इसे हटाने के लिए) काम करता है। यह तब एक KEY*अलग-अलग के रूप में एक कम ascii चार (जो आपके इनपुट में होने की संभावना नहीं है) का उपयोग करके अपने संबंधित अनुभाग में प्रत्येक पंक्ति को जोड़ता है और फिर एक ही विभाजक का उपयोग करके nसभी lines को खाता है । यह तब केवल sort3rd और 1st फील्ड द्वारा आईएनजी की बात है और cutबीच के कॉलम को टिंग करना और फिर एक फाइनल के माध्यम से सीमांकक को पुनर्स्थापित करना है sed। ध्यान दें कि उपरोक्त के साथ, आपकी आवश्यकताओं के अनुसार आदेश समायोजित करने KEY12से पहले सॉर्ट करेगा ।KEY2sort


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