टैब सीमांकित फ़ाइल को सॉर्ट करना


180

मेरे पास निम्न प्रारूप वाला डेटा है:

foo<tab>1.00<space>1.33<space>2.00<tab>3

अब मैंने अंतिम फ़ील्ड के आधार पर फ़ाइल को क्रमिक रूप से सॉर्ट करने का प्रयास किया। मैंने निम्नलिखित आदेशों की कोशिश की, लेकिन जैसा कि हमने उम्मीद की थी, उसे हल नहीं किया गया था।

$ sort -k3nr file.txt  # apparently this sort by space as delimiter

$ sort -t"\t" -k3nr file.txt
  sort: multi-character tab `\\t'

$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
  sort: multi-character tab `\\t'

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

यहाँ नमूना डेटा है

जवाबों:


312

बैश का उपयोग करना , यह चाल होगी:

$ sort -t$'\t' -k3 -nr file.txt

एकल-उद्धृत स्ट्रिंग के सामने डॉलर का चिह्न देखें। आप इसके बारे में बैश मैन पेज के ANSI-C क्वोटिंग सेक्शन में पढ़ सकते हैं ।


2
'"'"'इसे एक उपनाम के अंदर उपयोग करने के लिए उपयोग करें
पाब्लो ए

क्या आप दिखा सकते हैं कि एक जागृत आदेश के अनुसार इस परिधि को कैसे पारित किया जाए? के रूप में awk '{print $0 | "sort -nr" > "outfile" }' datafile, के रूप में एक बच टैब टैब परिधि के साथ क्रमबद्ध करने के लिए भेजा।
मर्लिन

11

डिफ़ॉल्ट रूप से फ़ील्ड सीमांकक रिक्त संक्रमण के लिए गैर-रिक्त है, इसलिए टैब को बस ठीक काम करना चाहिए।

हालाँकि, स्तंभों को आधार 1 और आधार 0 अनुक्रमित किया गया है, इसलिए आप शायद चाहते हैं

sort -k4nr file.txt

क्रमबद्ध रूप में कॉलम 4 द्वारा file.txt को क्रमबद्ध करने के लिए। (हालांकि प्रश्न में डेटा में 5 फ़ील्ड भी हैं, इसलिए अंतिम फ़ील्ड इंडेक्स 5. होगा)


4
यह तभी काम करेगा जब इनपुट के सभी लाइनों के लिए टैब-अलग फ़ील्ड्स के बीच अंतरिक्ष वर्णों की संख्या समान हो।
लार्स हग्सथ

5

-T \ _ के बाद आपको एक वास्तविक टैब कैरेक्टर डालने की जरूरत होती है और शेल में आप ctrl-v और फिर टैब कैरेक्टर को हिट करते हैं। अधिकांश गोले मैंने उपयोग किए हैं जो शाब्दिक टैब प्रविष्टि के इस मोड का समर्थन करते हैं।

हालांकि, सावधान रहें, क्योंकि दूसरी जगह से कॉपी करना और चिपकाना आम तौर पर टैब को संरक्षित नहीं करता है।


यह सबसे अच्छा (सबसे पोर्टेबल) उत्तर है। emacs आपको यह भी करने देता है कि 'कोटेड इंसर्ट' मोड में: C-q <tab>उदाहरण के लिए। मुझे लगता है कि यह ^Vनैनो में भी है।
व्याट8740

3

$ समाधान मेरे लिए काम नहीं किया। हालाँकि, वास्तव में टैब कैरेक्टर को कमांड में ही डालकर: Sort -t '' -k2


1
<C-v><Tab>आपके शेल में स्वतः पूर्णता के लिए टैब कुंजी का उपयोग करने की स्थिति में टैब सम्मिलित करने के लिए उपयोग करें ।
जूडा रॉनें

1
ANSI $'\t'क्विंग ksh, zsh और bash में काम करता है। बॉर्न शेल इसका समर्थन नहीं करता है। इस पोस्ट को देखें: unix.stackexchange.com/a/371873/201820
codeforester

1

इसे कुछ इस तरह से पाइप करें awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'। यह रिक्त स्थान को टैब में बदल देगा।


@ एमबी: मुझे अंतरिक्ष को बरकरार रखने की आवश्यकता है।
नववरवधू

1
निस्संदेह इसे करने के लिए एक क्लीनर तरीका है, लेकिन कुछ भी आपको इसे awk के माध्यम से पाइप करने से रोकता है, रिक्त स्थान को टैब में बदल दें, डेटा को सॉर्ट करें, और फिर इसे awk के माध्यम से पाइपिंग करें, टैब को वापस रिक्त स्थान में बदल दें।
मिचेल बडिंगडिंग

1
यदि टैब और रिक्त स्थान का मिश्रण है जिसे आप संरक्षित करना चाहते हैं तो यह काम नहीं करेगा।
जेम्स थॉम्पसन

1

आम तौर पर इस तरह के डेटा को रखना कोई बड़ी बात नहीं है अगर आप इससे बच सकते हैं, क्योंकि लोग हमेशा टैब और स्पेस को भ्रमित कर रहे हैं।

आपकी समस्या का समाधान पर्ल, पायथन या रूबी जैसी स्क्रिप्टिंग भाषा में बहुत सीधा है। यहाँ कुछ उदाहरण कोड है:

#!/usr/bin/perl -w

use strict;

my $sort_field = 2;
my $split_regex = qr{\s+};

my @data;
push @data, "7 8\t 9";
push @data, "4 5\t 6";
push @data, "1 2\t 3";

my @sorted_data = 
    map  { $_->[1] }
    sort { $a->[0] <=> $b->[0] }
    map  { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
    @data;

print "unsorted\n";
print join "\n", @data, "\n";
print "sorted by $sort_field, lines split by $split_regex\n";
print join "\n", @sorted_data, "\n";

1

मैं विंडोज पर ग्नू सॉर्ट के लिए एक समाधान चाहता था, लेकिन उपरोक्त समाधानों में से कोई भी मेरे लिए कमांड लाइन पर काम नहीं करता था।

लॉयड के सुराग का उपयोग करते हुए, निम्न बैच फ़ाइल (.bat) ने मेरे लिए काम किया।

दोहरे कोट्स के भीतर टैब कैरेक्टर टाइप करें।

C:\>cat foo.bat

sort -k3 -t"    " tabfile.txt

1
हाँ यहाँ ट्रिक इसे एक .bat फ़ाइल में डाल रहा है, अन्यथा यह काम नहीं करेगा
कार्लोस रेंडन

1

'सामान्य-सांख्यिक-प्रकार' का उपयोग करते समय मुझे बैश शेल में साइबरगन के साथ यह समस्या थी। यदि मैंने निर्दिष्ट किया है -t$'\t' -kFg, जहां एफ क्षेत्र संख्या है, तो यह काम नहीं किया, लेकिन जब मैंने दोनों को निर्दिष्ट किया -t$'\t'और -kF,Fg( -k7,7g7 वें क्षेत्र के लिए) यह काम किया। -kF,Fgबिना -t$'\t'काम नहीं किया।


0

यदि आप केवल टैब करके अपने लिए इसे आसान बनाना चाहते हैं, तो रिक्त स्थान को टैब से बदलें:

tr " " "\t" < <file> | sort <options>

मेरी tr फाइलें नहीं पढ़ती हैं, केवल XD स्ट्रीम करती हैं। usage: tr [-Ccsu] string1 string2
अनफिन कैट

1
tr string1 string2 <some-file। सब कुछ एक फ़ाइल को तब तक पढ़ सकता है जब तक वह स्टडिन को पढ़ सकता है।
रान्डल शवार्ट्ज

0

Lars Haugseth उत्तर ने केवल मेरे लिए कमांड लाइन से काम किया जहां यह एक शेल स्क्रिप्ट से निष्पादित होने पर यह त्रुटि देता है:

सॉर्ट: मल्टी-कैरेक्टर टैब '$ \ t'

अगर किसी की तलाश है तो इसका समाधान शेल स्क्रिप्ट में कोड किया गया है

sort -t'    '

टैब वर्ण बोली के बीच में है।

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