লাইনের ব্লকগুলি বাছাই করা হচ্ছে


12

আমার কাছে একটি ফাইল রয়েছে যাতে 4n লাইন থাকে। এটি থেকে 8 টি লাইন সমন্বিত একটি অংশ এখানে দেওয়া হয়েছে

6115 8.88443
6116 6.61875
6118 16.5949
6117 19.4129
6116 6.619 
6117 16.5979 
6118 19.4111
6115 8.88433  

আমি যা করতে চাই তা হল একটি ব্লক বাছাই করা, যেখানে প্রতিটি ব্লকে প্রথম কলামের উপর ভিত্তি করে 4 টি লাইন থাকে। নীচে প্রদর্শিত হিসাবে অংশ হিসাবে আউটপুট দেখতে হবে।

6115 8.88443
6116 6.61875
6117 19.4129
6118 16.5949
6115 8.88433 
6116 6.619 
6117 16.5979 
6118 19.4111 

উত্তর:


16

একটি বিকল্প হ'ল প্রতিটি এন লাইনের (আপনার ক্ষেত্রে এন = 4) প্রাথমিক সিরিয়াল নম্বর উপসর্গ যোগ করার জন্য ব্যবহার করা । তারপরে এটিকে প্রাথমিক বাছাইকরণ কলাম হিসাবে উপসর্গটি সরবরাহ করুন sort

এন = 4 সহ উদাহরণ:

awk '{print int((NR-1)/4), $0}' file.txt | sort -n -k1,1 -k2,2 | cut -f2- -d' '

7

যদি এটি বন্ধ হয় এবং আপনি অজগর, পারল বা অজক শিখতে না চান তবে আপনি বেসিক splitএবং sortআদেশগুলি দিয়ে যেতে পারেন ।

প্রথমে -l বিকল্পটি দিয়ে 4 লাইন খণ্ডে ফাইলটি বিভক্ত করুন :

split -a 6 -l 4 input_file my_prefix_
for fn in my_prefix_*; do
    sort -n -o $fn $fn
done
cat my_prefix_* > output_file
rm my_prefix_*

sort -nপ্রথম কলাম (999 1234 আগে) এর সংখ্যাগত মান দ্বারা প্রকারের। -a 626 ^ 6 * 4 লাইন সহ কোনও ফাইলের যত্ন নেওয়া উচিত। my_prefix_আপনি যে ডিরেক্টরিটি দিয়ে কাজ করছেন তার কিছু অনন্য হওয়া উচিত।


3

আপনি পার্ল দিয়ে এটি করতে পারেন:

perl -nle '
   push @a,$_;
   unless($. % 4){
       print join "\n",sort {$a <=> $b} @a; # Sort @a, and print its contents
       @a = (); # Empty @a to start a new block
   }
' your_file

এটি কীভাবে কাজ করে

  • -n-> প্রতিটি ইনপুট লাইনের জন্য কোড চালান (এবং বর্তমান লাইনটি এতে লাগান $_)
  • -l -> যে কোনওটির আউটপুটে একটি নতুন লাইন যুক্ত করুন print
  • -e -> পার্ল কোড হিসাবে নিম্নলিখিত স্ট্রিং কার্যকর করুন
  • প্রতিটি লাইন অ্যারে সংযুক্ত করা হয় @a
  • $.বর্তমান লাইন নম্বরটি ধারণ করে এবং যদি না যে সংখ্যাটি শূন্য মডেলো 4 এর সাথে একত্রে না হয়, তবে আমরা কাজ করে চলেছি keep যদি হয় শূন্য মডিউল 4 সর্বসম, আমরা একটি লাইন যার সংখ্যা 4 (একটি ব্লক শেষে) এর একাধিক, যা ক্ষেত্রে, আমরা সাজানোর মধ্যে এন্ট্রি পৌঁছেছেন @aসংখ্যাসূচক অর্ডার আরোহী এবং এন্ট্রি সাজানো অ্যারের মধ্যে প্রিন্ট স্ট্যান্ডার্ড আউটপুটে একটি নতুন লাইন দ্বারা যোগদান।

2

বোর্নের মতো শেল ব্যবহার করে,

while read a ; do                                           # Try reading a line.
    read b ; read c ; read d                                # OK, read 3 more.
    printf '%s\n%s\n%s\n%s\n' "$a" "$b" "$c" "$d" | sort -n # Sort them.
done < data

2

এখানে কিছু "খাঁটি" awkসমাধান রয়েছে:

যদি সূচকগুলি সর্বদা আপনার বর্ধিত পূর্ণসংখ্যার ক্রম (6115-6119) হয়, আপনার নমুনা-উপাত্তের মতো, আপনি একটি অ্যালগরিদমিক "শর্টকাট" ব্যবহার করতে পারেন:

awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'

এটা করে

  • অ্যারেতে সমস্ত লাইন যুক্ত করুন a, সূচক পজিশনে বিতরণ 6115-6119
  • প্রতি 4 র্থ লাইনে ( !(NR%4)) এ অ্যারে সামগ্রীগুলি পছন্দসই ক্রমে মুদ্রণ করতে লুপ করুন।

যদি আপনার সংখ্যাসূচক সূচকগুলি সর্বদা চারটি হয় তবে বর্ধমান পূর্ণসংখ্যার ক্রম নয়, আপনাকে বাছাই করতে হবে:

awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'

দ্রষ্টব্য: এটি জিএনইউ অ্যাডকের সাথে রয়েছে, অন্যরা সমর্থন করতে পারে না asort


চারটি ব্লকের যদি পৃথক সংখ্যক আইডি থাকতে পারে:

awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'

দ্রষ্টব্য: @ গিলস স্ব-উত্তরdelete থেকে টিআইএল (+2) এর ব্যবহার (এখনও) পসিক্স নয়, তবে সর্বজনীন সমর্থিত


এর সঠিক ™ ব্যবহার সহ একটি সংস্করণ delete:

awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'

মোছা ছাড়াই একটি সংস্করণ, আরও স্মৃতি এবং মাত্রা ব্যবহার করে:

awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}

1

আপনি আর এর সাহায্যে একটি পরিষ্কার সমাধান পেতে পারেন above পছন্দসই ফলাফলটি "টেবিলআউট.টেক্সট" ফাইলটিতে থাকবে।

> x = read.table("table.txt", col.names=c("a", "b"))
> x
     a        b
1 6115  8.88443
2 6116  6.61875
3 6118 16.59490
4 6117 19.41290
5 6116  6.61900
6 6117 16.59790
7 6118 19.41110
8 6115  8.88433
> x["index"] = c(rep(1, 4), rep(2, 4))
> x
     a        b index
1 6115  8.88443     1
2 6116  6.61875     1
3 6118 16.59490     1
4 6117 19.41290     1
5 6116  6.61900     2
6 6117 16.59790     2
7 6118 19.41110     2
8 6115  8.88433     2     
> xord = x[with(x, order(index, a)), ]
> xord
     a        b index
1 6115  8.88443     1
2 6116  6.61875     1
4 6117 19.41290     1
3 6118 16.59490     1
8 6115  8.88433     2
5 6116  6.61900     2
6 6117 16.59790     2
7 6118 19.41110     2
> write.table(xord[,1:2], "tableout.txt", row.names=FALSE, col.names=FALSE)

আর-এ কলাম (গুলি) দ্বারা ডেটাফ্রেমকে কীভাবে সাজানো যায় তা দেখুন ।

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