একটি ট্যাব সীমিত ফাইল বাছাই করা


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'

এটি করার সঠিক উপায় কী?

এখানে নমুনা তথ্য

উত্তর:


311

ব্যাশ ব্যবহার করে , এটি কৌশলটি করবে:

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

একক-উদ্ধৃত স্ট্রিংয়ের সামনে ডলার সাইনটি লক্ষ্য করুন। আপনি এ সম্পর্কে বাশ ম্যান পৃষ্ঠার এএনএসআই-সি উদ্ধৃতি বিভাগে পড়তে পারেন ।


1
'"'"'এটি একটি উপন্যাসের ভিতরে ব্যবহার করতে ব্যবহার করুন
পাবলো এ

আপনি কীভাবে এইডকে কমান্ডের মধ্যে বাছাই করতে এই ডিলিমিটারটি পাস করতে পারবেন? যেমনটি রয়েছে awk '{print $0 | "sort -nr" > "outfile" }' datafile, পালানো ট্যাব ডেলিমিটার বাদে সারণি কমান্ডে প্রেরণ করা হবে।
মার্লিন 0

11

ডিফল্টরূপে ক্ষেত্রের ডিলিমিটারটি ফাঁকা স্থানান্তর থেকে ফাঁকা হয় তাই ট্যাবটি ঠিকঠাকভাবে কাজ করা উচিত।

তবে কলামগুলি বেস 1 এবং বেস 0 সূচিবদ্ধ হয় যাতে আপনি সম্ভবত চান

sort -k4nr file.txt

বিপরীত ক্রমে সংখ্যাসূচকভাবে 4 কলাম দ্বারা file.txt বাছাই করতে। (যদিও প্রশ্নের ডেটাতে 5 টি ক্ষেত্র রয়েছে তাই শেষ ক্ষেত্রটি সূচী 5 হবে))


4
এটি কেবলমাত্র তখনই কাজ করবে যদি ট্যাব-বিভাজিত ক্ষেত্রগুলির মধ্যে সমস্ত অক্ষরের ইনপুটগুলির জন্য একই হয় characters
লার্স হগসেট

5

আপনাকে -t after এর পরে একটি প্রকৃত ট্যাব অক্ষর স্থাপন করতে হবে এবং শেলটিতে এটি করতে আপনি সিটিআরএল-ভি এবং তারপরে ট্যাব অক্ষরটি চাপুন। আমি ব্যবহার করেছি বেশিরভাগ শেলগুলি এই মোডে আক্ষরিক ট্যাব এন্ট্রি সমর্থন করে।

সতর্ক থাকুন, কারণ অন্য জায়গা থেকে অনুলিপি করা এবং আটকানো সাধারণত ট্যাব সংরক্ষণ করে না।


এটি সেরা (সবচেয়ে বহনযোগ্য) উত্তর। ইম্যাকস আপনাকে 'উদ্ধৃত সন্নিবেশ' মোডে এটি করতে দেয়: C-q <tab>উদাহরণস্বরূপ। আমি মনে করি এটি ^Vন্যানোতেও রয়েছে।
Wyatt8740

3

সমাধানটি আমার পক্ষে কার্যকর হয়নি। যাইহোক, ট্যাব অক্ষরটি নিজেই কমান্ডের মধ্যে রেখে: সাজানো -t ''-কে 2 করুন


1
<C-v><Tab>ট্যাব কীটি আপনার শেলটিতে স্বয়ংক্রিয়ভাবে সমাপ্তির জন্য ব্যবহৃত হয় সে ক্ষেত্রে ট্যাব সন্নিবেশ করতে ব্যবহার করুন ।
Júda Ronén

1
এএনএসআই উদ্ধৃতি $'\t'ksh, zsh, এবং bash এ কাজ করে। বোর্ন শেল এটি সমর্থন করে না। পোস্টটি দেখুন: unix.stackexchange.com/a/371873/201820
কোডফোরস্টার

1

এটি কিছু মাধ্যমে পাইপ awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'। এটি স্পেসগুলি ট্যাবগুলিতে পরিবর্তন করবে।


@ এমবি: আমার স্থানটি অটুট রাখতে হবে।
neversaint

1
এটি করার নিঃসন্দেহে একটি পরিষ্কার উপায় আছে, তবে কিছুই আপনাকে এড়কিউ এর মাধ্যমে পাইপ দেওয়া থেকে স্পেস ফাঁকা করে ট্যাবগুলিতে পরিবর্তন করে, ডেটা বাছাই করে এবং আবার ট্যাঙ্কগুলিকে ফাঁকা জায়গায় পরিবর্তন করে বাধা দেয়।
মিশিয়েল বুদদিঘ

1
আপনি সংরক্ষণ করতে চান এমন ট্যাব এবং স্পেসগুলির মিশ্রণ থাকলে এটি কাজ করবে না।
জেমস থম্পসন

1

আপনি যদি এড়াতে পারেন তবে সাধারণভাবে এই জাতীয় ডেটা রাখা কোনও দুর্দান্ত জিনিস নয় কারণ লোকেরা সর্বদা ট্যাব এবং স্পেসগুলি বিভ্রান্ত করে।

পার্ল, পাইথন বা রুবির মতো স্ক্রিপ্টিং ভাষায় আপনার সমস্যার সমাধান খুব সোজা is এখানে কয়েকটি উদাহরণ কোড দেওয়া হয়েছে:

#!/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,7gthe তম ক্ষেত্রের জন্য) নির্দিষ্ট করে দিলে এটি কাজ করে। কাজ না করে -kF,Fgছাড়া -t$'\t'


0

আপনি যদি কেবলমাত্র ট্যাব রেখে নিজের জন্য আরও সহজ করতে চান তবে ফাঁকা স্থানগুলি ট্যাবগুলির সাথে প্রতিস্থাপন করুন:

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

আমার টিআর ফাইলগুলি পড়ে না, কেবল এক্সডি প্রবাহিত করে। usage: tr [-Ccsu] string1 string2
আনফুন বিড়াল

1
tr string1 string2 <some-file। স্ট্যান্ডিন যতক্ষণ পড়তে পারে ততক্ষণ সমস্ত কিছু ফাইল পড়তে পারে।
র্যান্ডাল শোয়ার্জ

0

লার্স হগসেট উত্তর কেবলমাত্র আমার জন্য কমান্ড লাইন থেকে কাজ করেছিল যেখানে শেল স্ক্রিপ্ট থেকে সম্পাদন করা হলে এটি এই ত্রুটিটি দেয়:

বাছাই করুন: বহু-চরিত্রের ট্যাব '$ \ t'

সমাধান যদি এটি শেল স্ক্রিপ্টে কোড করা থাকে তবে যদি কারও সন্ধান হয়

sort -t'    '

ট্যাব অক্ষরটি উদ্ধৃতিটির মধ্যে রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.