প্রথম লাইনের উপর ভিত্তি করে কলামগুলি কীভাবে সাজান?


12

আমাকে খুব বড় ডেটাসেটের কলামগুলি বাছাই করতে হবে (1000 লাইন এবং 700000 কলাম)। উদাহরণ হিসাবে, আমার কলামগুলি এলোমেলোভাবে সাজানো হয়েছে: কল 1 কল 4 কল 3 কল 2, এবং আমার এটি বাছাই করা দরকার।

আমি কিছু কমান্ড চেষ্টা করে দেখছি, তবে কোনও সাফল্য নেই।

উদাহরণ:

ID M2 M5 M8 M1 M3 M9 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln

এই উদাহরণে, বিন্দুগুলির অর্থ আমার কাছে প্রচুর কলাম এবং লাইন রয়েছে। আবার, কলামগুলির মতো হওয়ার জন্য আমাকে বাছাই করতে হবে:

ID M1 M2 M3 M4 M5 M6 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln

ধন্যবাদ


আপনি ডেটা সেট কয়েক লাইন দিয়ে একটি উদাহরণ যোগ করতে পারেন?
jcbermu

আপনার প্রত্যাশিত ফলাফলটি কেবল প্রথম লাইনের বাছাই হয়েছে, অন্যান্য মান একই থাকবে কেন?
রোমানপেরেখারেস্ট

আসলে, এটি কলামগুলি অনুসরণ করা প্রয়োজন, উদাহরণের একটি ভুল ছিল। দুঃখিত
এলএলভেরার্ডো

প্রথম লাইনের ভিত্তিতে পুরো কলামটি বাছাই করা দরকার।
এলএলভেরার্ডো

2
স্থানান্তর, প্রথম কলাম অনুসারে বাছাই, ফিরে স্থানান্তর।
সাতা কাটসুরা

উত্তর:


10

জিএনইউ datamashএবং জিএনইউ সহ sort:

datamash transpose -t ' ' -H <file_in.csv | sort -V | datamash transpose -t ' ' -H >file_out.csv

এটি "যুক্তিসঙ্গতভাবে ছোট" ডেটার জন্য সূক্ষ্ম কাজ করে। এটি আপনার ফাইলের সাথে কাজ করতে বা নাও করতে পারে।

সম্পাদনা করুন: স্থানান্তর ছাড়াই নীচের সমাধানগুলি কম সংস্থান-নিবিড় হওয়া উচিত।


1
টাকা কমান্ড হতে পারে একটি লাইটার বিকল্প datamashযেমন rs -T < file_in.csv | sort | rs -T -C' '( rsডেবিয়ান ভিত্তিক সিস্টেমে একটি প্যাকেজ হিসাবে উপলব্ধ হওয়া উচিত)
steeldriver

2
এফডাব্লুআইডাব্লু, rs("একটি ডেটা অ্যারে পুনরায় আকার দিন") কিছু বিএসডি এর বেস সিস্টেমে উপলব্ধ।
কুসালানন্দ

6
perl -pale '
   $. == 1 and
   @I = map  { $_->[1] }
        sort { $a->[0] <=> $b->[0] }
        map  { [ $F[$_] =~ /^M(\d+)$/, $_ ] } 1..$#F;
   $_ = "@F[0, @I]";
' yourlargefile

  1. প্রথম লাইনের জন্য, আমরা সংখ্যায় সাজিয়েছি এটি ২ য় ... শেষের কলামগুলি সংখ্যার Mশুরুতে সংখ্যার পরে অংশটি ব্যবহার করে সুপরিচিত ব্যবহার করে Schwartzian maneuver। এটি আমাদের সূচকগুলি পুনরায় সাজানোকে সহায়তা করে যাতে কলামগুলি সংখ্যা অনুসারে বাছাই করা ক্রমে (এম 1, এম 2, এম 3, ...) আসে
  2. অবশিষ্ট সমস্ত উপাদানগুলি @Iপুনরায় সাজানোর জন্য আগত এই সূচকগুলি ব্যবহার করা @F
  3. ডাবল-উদ্ধৃত ফর্মটিতে অ্যারে নির্ধারণ করা এটিকে উপাদান স্থান পৃথক করে স্ট্রিংয়ে রূপান্তরিত করে।
  4. -pপার্লের বিকল্পগুলি $_সামগ্রীর স্বতঃপ্রকাশ সক্ষম করে , -lযোগ করবে newline

6

পার্ল মডিউলটি বাছাই করুন :: প্রাকৃতিকভাবে

তথ্য অন্তর্ভুক্তী

ID M2 M5 M8 M1 M3 M9 M700000
A1 m1,2 m1,5 m1,8 m1,1 m1,3 m1,9 m1,7000000
A2 m2,2 m2,5 m2,8 m2,1 m2,3 m2,9 m2,7000000
A3 m3,2 m3,5 m3,8 m3,1 m3,3 m3,9 m3,7000000
A1000 m1000,2 m1000,5 m1000,8 m1000,1 m1000,3 m1000,9 m1000,7000000
perl -MSort::Naturally -lane '
  if ($. == 1) {
    @indices = (0, map  { $_->[0] }
                   sort { ncmp($a->[1], $b->[1]) }
                   map  { [$_, $F[$_]] }
                   1..$#F
               );
    $, = " ";
  }
  print @F[@indices]
' test.data

আউটপুট

ID M1 M2 M3 M5 M8 M9 M700000
A1 m1,1 m1,2 m1,3 m1,5 m1,8 m1,9 m1,7000000
A2 m2,1 m2,2 m2,3 m2,5 m2,8 m2,9 m2,7000000
A3 m3,1 m3,2 m3,3 m3,5 m3,8 m3,9 m3,7000000
A1000 m1000,1 m1000,2 m1000,3 m1000,5 m1000,8 m1000,9 m1000,7000000

সর্বাধিক মার্জিতদের জন্য +1, কলামের নামগুলির জন্য খুব সুনির্দিষ্ট উপসর্গ গ্রহণ করে না, একটি পাসের সমাধান।
আরিফ

4

আপনার যদি rsইউটিলিটি ইনস্টল থাকে তবে আপনি এটি করতে পারেন:

rs -c' ' -T | {
    stdbuf -i0 sed "1q"
    sort -V
} | rs -C' ' -T

বা সমস্ত এক লাইনে:

rs -c' ' -T | { stdbuf -i0 sed "1q"; sort -V ; } | rs -C' ' -T
  • প্রথম rsইনপুট ডেটা স্থানান্তর করে (স্পেস-স্পার্টেড ফিল্ড সহ)
  • কমান্ড গ্রুপ:
    • sedপ্রথম লাইনটি পড়ে, এটি আউটপুট করে, তারপরে প্রস্থান করে, বাকী পাইপটি rsছোঁয়া থেকে ছেড়ে দেয় । ইনপুট বাফারিং বন্ধ করে কেবল প্রথম নিউলাইন পর্যন্ত পড়তে হবে এবং এটির আর কোনও stdbufদরকার নেই তা নিশ্চিত করা প্রয়োজনsed
    • sortবাকি লাইন গুলি
  • দ্বিতীয়টি rsফলস্বরূপ স্ট্রিমটিকে তার মূল ফর্ম্যাটে ফিরিয়ে দেয়।

rsMacOS এ ডিফল্টরূপে ইনস্টল করা আছে। লিনাক্স সিস্টেমে আপনার এটি ইনস্টল করতে হতে পারে - যেমন

sudo apt install rs

ক্যাভ্যাট: stdbufএবং sortএর -Vবিকল্পগুলি জিএনইউ-নির্দিষ্ট তাই অশোধিত ম্যাকোএসে কাজ করবে না।


0

আপনার যদি জিএনইউ থাকে তবে আপনি এটি ব্যবহার করে দেখতে পারেন awk:

NR == 1 {
    for (i = 2; i <= NF; i++) {
        columns[substr($i, 2)] = i;
    }
    count = asorti(columns, sorted, "@ind_num_asc");
    printf("%s", $1);
    for (i = 1; i <= count; i++) {
        printf(" M%s", sorted[i]);
        indx[i] = columns[sorted[i]];
    }
    print "";
    next;
}
{
    printf("%s", $1);
    for (i = 1; i <= count; i++) {
        printf(" %s", $(indx[i]));
    }
    print "";
}

0

পাইথনে:

from csv import DictReader, DictWriter
with open('in_file.csv') as infile, open('out_file.csv') as outfile:
  reader = DictReader(infile)
  writer = DictReader(outfile, fieldnames=sorted(reader.fieldnames))
  writer.writerows(reader)

0

আপনি এটিকে ভাল উত্তর হিসাবে বিবেচনা করেছেন কিনা তা আমি জানি না, তবে ...

আপনি কেন এই সমস্যা সমাধানের জন্য একটি ডাটাবেস ব্যবহার করবেন না? আপনি অস্থায়ী টেবিল হিসাবে আপনার ডেটাসেট আমদানি করতে পারেন এবং তারপরে একটি করতে পারেন

কলাম 1, কলাম 2, ... কলাম-এন থেকে আমার_টেমি_ট্যাবল নির্বাচন করুন

আপনার প্রয়োজন মতো আপনি অন্য ফিল্টার বা রূপান্তর ব্যবহার করতে পারেন। তারপরে, আপনার প্রয়োজন অনুসারে আপনি নিজের আউটপুটটিকে পুনরায় ফর্ম্যাট করতে পারেন।

এই সমস্ত কাজ বাশ স্ক্রিপ্ট হিসাবে অগ্রগতি হতে পারে, এবং পাইপ ব্যবহার করে আউটপুট চেইন।

কমান্ডগুলির মধ্যে আউটপুট অগ্রগতি দেখতে কখনও কখনও "pv" কমান্ড ব্যবহার করা হয়।

ডেটাसेट আমদানি করতে আপনি পেন্টাহো ডেটা ইন্টিগ্রেশন ব্যবহার করে কোনও ইটিএল প্রোগ্রাম করতে পারেন।


0

হতে পারে এটি আপনাকেও সহায়তা করতে পারে।

  1. প্রথমে আপনি নিজের ফাইলটি ট্রান্সপোজ ব্যবহার করতে পারেন ( /programming/1729824/an-effic-way-to-transpose-a-file-in-bash এর মধ্যে একটি )
  2. সাজানো কমান্ড সহ প্রথম কলামটি বাছাই করুন।
  3. আবার ট্রান্সপোজ করুন।

উদা:

$ echo "ID M2 M5 M8 M1 M3 M9 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln" | awk '
{ 
    for (i=1; i<=NF; i++)  {
        a[NR,i] = $i
    }
}
NF>p { p = NF }
END {    
    for(j=1; j<=p; j++) {
        str=a[1,j]
        for(i=2; i<=NR; i++){
            str=str" "a[i,j];
        }
        print str
    }
}' | sort -n | awk '
{ 
    for (i=1; i<=NF; i++)  {
        a[NR,i] = $i
    }
}
NF>p { p = NF }
END {    
    for(j=1; j<=p; j++) {
        str=a[1,j]
        for(i=2; i<=NR; i++){
            str=str" "a[i,j];
        }
        print str
    }
}'
ID M1 M2 M3 M5 .....M7000000 M8 M9
Animal1 1 1 0 0 .....1 2 2
Animal2 0 0 1 1 .....0 2 1
Animal3 1 2 2 1 .....0 0 1
.       
.       
.       
.       
Animaln    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.