2010-07-07 9 views
13

मैं अधिक फ़ील्ड पर एक फ़ाइल सॉर्ट करना चाहता हूं। एक नमूना टैब अलग फ़ाइल है:यूनिक्स सॉर्टिंग, प्राथमिक और माध्यमिक कुंजी के साथ

a 1 1.0 
b 2 0.1 
c 3 0.3 
a 4 0.001 
c 5 0.5 
a 6 0.01 
b 7 0.01 
a 8 0.35 
b 9 2.3 
c 10 0.1 
c 11 1.0 
b 12 3.1 
a 13 2.1 

और मुझे (-d के साथ) यह क्षेत्र 1 करके वर्णानुक्रम में क्रमित करना चाहते हैं, और जब फ़ील्ड 1 प्रकार क्षेत्र 3 (-g विकल्प के साथ) द्वारा, एक ही है।

ए ऐसा करने में सफल नहीं हुआ।

cat tst | sort -t"<TAB>" -k1 -k3n 
cat tst | sort -t"<TAB>" -k1d -k3n 
cat tst | sort -t"<TAB>" -k3n -k1d 

इनमें से कोई नहीं काम कर रहे हैं: मेरी attemps (<TAB> के बजाय एक असली टैब चरित्र के साथ) थे। मुझे यकीन नहीं है कि सॉर्ट ऐसा करने में भी सक्षम है। मैं वर्कअराउंड के लिए एक स्क्रिप्ट लिखूंगा, इसलिए मैं केवल उत्सुक हूं कि केवल सॉर्ट का उपयोग करके कोई समाधान है या नहीं।

+0

' sort' आदेश इस का समर्थन नहीं करता है। इसके बजाय पाइथन या पर्ल जैसी भाषा में स्विच करने पर विचार करें। – Philipp

+0

हाँ, निश्चित रूप से यह मेरा कामकाज होगा, जैसा कि मैंने उल्लेख किया है। मैं सिर्फ यह जानना चाहता था कि कोई इसे शुद्ध प्रकार के साथ कर सकता है – zseder

उत्तर

11

manual कुछ उदाहरण दिखाता है।

zseder की टिप्पणी के अनुसार, इस काम करता है:

sort -t"<TAB>" -k1,1d -k3,3g 

टैब सैद्धांतिक रूप से इस sort -t"\t" की तरह भी काम करना चाहिए।

TAB=`echo -e "\t"` 
sort -t"$TAB" 
+0

यह काम कर रहा है! धन्यवाद। (Cmd के साथ: 'sort -t "" -k1,1d -k3,3g') हालांकि, मुझे नहीं मिला कि लिंक किए गए मैनुअल और सामान्य मैन्युअल पृष्ठ में सॉर्ट करने के लिए कॉमा का अर्थ क्या है। मुझे इस पर और अधिक Google करना है। और हाँ, मैं टैब के साथ सॉर्ट कर सकता हूं। मैं इसे किसी भी अन्य विभाजक से sed कर सकता हूं, और मैं अपने टर्मिनल को "ctrl + v; TAB" के साथ टैब दे सकता हूं, इसलिए यह कोई समस्या नहीं है, मैं बस यह स्पष्ट करना चाहता था कि मैं गलत नहीं कर रहा हूं। वैसे भी, धन्यवाद! – zseder

+1

आप 'echo' या ctrl + v: 'TAB = $' \ t'' का उपयोग किए बिना एक टैब भी बना सकते हैं। @zseder: अल्पविराम इस संदर्भ में एक श्रेणी ऑपरेटर है। तर्क '-k1,1d' का अर्थ है "कॉलम एक से शुरू होने वाली कुंजी बनाएं और शब्दकोश क्रम में स्तंभ एक पर समाप्त करें"। –

+0

और कैसे -k1d -k1,1d के बराबर नहीं है? मेरा इरादा यह है कि ये वही होना चाहिए ... – zseder

-3

यहाँ एक अजगर स्क्रिप्ट आप एक प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं वह यह है कि:

ऊपर काम से कोई भी टैब से पृथक करने के लिए है, तो यह एक बदसूरत समाधान नहीं है

#!/usr/bin/env python2.6 

import sys 
import string 

def main(): 
    fname = sys.argv[1] 
    data = [] 
    with open(fname, "rt") as stream: 
     for line in stream: 
      line = line.strip() 
      a, b, c = line.split() 
      data.append((a, int(b), float(c))) 
    data.sort(key=my_key) 
    print data 


def my_key(item): 
    a, b, c = item 
    return c, lexicographical_key(a) 


def lexicographical_key(a): 
    # poor man's attempt, should use Unicode classification etc. 
    return a.translate(None, string.punctuation) 


if __name__ == "__main__": 
    main() 
संबंधित मुद्दे