একটি ফাইলের লাইনের ক্রম পরিবর্তন করুন


11

আমি একটি নির্দিষ্ট প্যাটার্নে লাইনের ক্রম পরিবর্তন করার চেষ্টা করছি। অনেক লাইনের সাথে একটি ফাইলের সাথে কাজ করা (উদাঃ 99 লাইন)। প্রতি তিনটি লাইনের জন্য, আমি দ্বিতীয় লাইনটি তৃতীয় লাইন এবং তৃতীয়টি দ্বিতীয় লাইন হতে চাই।

EXAMPLE টি।

1- ইনপুট:

gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.
...

2- আউটপুট:

gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
...

উত্তর:


12

awkপূর্ণসংখ্যার গণিত ব্যবহার এবং:

awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay; delay=""} END { if(length(delay) != 0 ) { print delay } }' /path/to/input

মডুলাস অপারেটর পূর্ণসংখ্যা বিভাগ সম্পাদন করে এবং অবশিষ্টটিকে ফিরিয়ে দেয়, সুতরাং প্রতিটি লাইনের জন্য এটি 1, 2, 0, 1, 2, 0 ক্রমটি ফিরিয়ে দেবে [...]। এটি জেনে, আমরা কেবলমাত্র লাইনের ইনপুটটি সংরক্ষণ করি যেখানে মডিউলটি পরের জন্য 2 - বুদ্ধিমানের জন্য, শূন্য হওয়ার পরে ইনপুটটি প্রিন্ট করার পরে।


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

ভাল ক্যাচ জন্য ধন্যবাদ; আমি আমার আকারে একটি আকারকে আকারে অন্তর্ভুক্ত করেছি NR%3 == 0 { print; print delay; delay=""} END { if(length(delay) != 0 ) { print delay }
ডোপঘোতি

23
$ seq 9 | sed -n 'p;n;h;n;G;p'
1
3
2
4
6
5
7
9
8

এটি হ'ল, pবর্তমান লাইনটি nছড়িয়ে দিন, এক্সট একটি পাবেন, hপুরনো হবেন n, এক্সট এক পাবেন Gএবং ধরে রেখাটি (এটি প্যাটার্ন স্পেসে সংযোজন করুন) এবং pতৃতীয় এবং দ্বিতীয় লাইনের সাথে 2-লাইনের প্যাটার্ন স্পেসটি অদলবদল করুন।


3

অন্য একটি অবাক পদ্ধতির:

awk '{print $0; if ((getline L2)>0 && (getline L3)>0){ print L3 ORS L2 }}' file

আউটপুট:

gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.

  • (getline L2)>0 && (getline L3)>0- যদি তারা উপস্থিত থাকে তবে পরবর্তী 2 টি রেকর্ড উত্তোলন করে

  • প্রতিটি 2 য় এবং 3 য় রেকর্ড যথাক্রমে নির্ধারিত হয় L2এবং L3ভেরিয়েবল


1
আমি ধরে নিচ্ছি vari ভেরিয়েবলগুলি L (ছোট ক্ষেত্রে) লেটার দিয়ে শুরু হবে। তারা পঠনযোগ্যতার জন্য দরিদ্র পছন্দ কারণ তারা বারো এবং তেরো এর সংখ্যার মতো দেখতে। আরও ভাল পছন্দ line2ইত্যাদি হতে পারে
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া।

@ ডেনিস উইলিয়ামসন, বড় হাতের বদলে পরিণত হয়েছে
রোমানপেরেখারেস্ট

1

ব্যবহার perlএবং একটি সংক্ষিপ্ত স্ক্রিপ্ট:

user@pc:~$ cat input.txt 
gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.

user@pc:~$ perl -ne '$l2=<>; $l3=<>; print $_,$l3,$l2;' input.txt 
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.

স্ক্রিপ্ট পুরো ফাইলটি প্রক্রিয়া করে, প্রতিটি লাইনের জন্য (সঞ্চিত $_) এটি পরবর্তী দুটি লাইন ( $l2এবং $l3) পাবে এবং অনুরোধ করা ক্রমে তাদের মুদ্রণ করবে: লাইন 1, লাইন 3, লাইন 2।


1

একটি উপায় নিম্নলিখিত হিসাবে হতে পারে:

sed -e '
   /\n/s/\(.*\)\(\n\)\(.*\)/\3\2\1/;//b
   $!N;$q;N;                            # load up the pattern space with 3 lines provided eof not reached
   P;D;                                 # first just print the first line then interchange the two and print them
' yourfile

অন্যথা,

perl -ne 'print $_, reverse scalar <>, scalar <>' yourfile

ফলাফল

gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.

1

কেন শুধু কিছুক্ষণ লুপ তৈরি করবেন না? প্রসারিত আকারে:

( while read a
  do
    read b
    read c
    echo "$a"
    echo "$c"
    echo "$b"
  done
) < input.txt

"একক লাইন বিন্যাসে":

( while read a ; do read b ; read c ; echo "$a" ; echo "$c" ; echo "$b" ; done) < input.txt

আউটপুট:

gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.

1

পার্ল

perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt

এখানে ধারণাটি হ'ল আমরা %লাইন নম্বর $.ভেরিয়েবল সহ মডুলো অপারেটরটি ব্যবহার করি , প্রতিবার প্রথমটি কোনটি প্রতি সেকেন্ডে এবং কোনটি প্রতি তৃতীয় লাইনে is প্রতি তৃতীয় লাইনের জন্য অবশিষ্ট 0 হয়, তবে প্রতি 1 ম এবং 2 য় লাইনের জন্য এটির সংশ্লিষ্ট সংখ্যা থাকবে।

টেস্ট:

$ cat input.txt                                                                                                          
gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.

$ perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt                                    
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.

গৌণ উন্নতি

একটি ভেরিয়েবলের মধ্যে দ্বিতীয় লাইন সংরক্ষণ করার পদ্ধতির একটি ত্রুটি রয়েছে। শেষ লাইনটি যদি "দ্বিতীয়" এক হয়, তবে সেই রেখার জন্য বাকি 2 হয়? আমার এবং ডোপগোতির উত্তরের মূল কোডটি My dog is orangeআমরা শেষ লাইনটি ছেড়ে দিলে মুদ্রণ করা হবে না । উভয় ক্ষেত্রেই এর END{}সমাধানটি হ'ল মুদ্রণের পরে অস্থায়ী ভেরিয়েবলটি সেট না করে কোড ব্লক ব্যবহার করা । অন্য কথায়:

$ awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay;delay=""}END{print delay}' input.txt

এবং

$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s}' input.txt 

এই পদ্ধতিতে কোডটি কেবল 3 দ্বারা বিভাজ্য নয়, কোনও ফাইলে স্বেচ্ছাসেবী সংখ্যার জন্য কাজ করবে।

মন্তব্যে উল্লিখিত ইস্যুটির জন্য অতিরিক্ত সমাধান

অজকের ক্ষেত্রে, যদি ফাইলের শেষ লাইনটি 1 এর আউটপুট উত্পাদন করে $ % 3, পূর্ববর্তী কোডটিতে শর্তহীন মুদ্রণের কারণে ফাঁকা নিউলাইন আউটপুট দেওয়ার বিষয়টি রয়েছে END{print delay}, যেহেতু printমন্তব্যে উল্লিখিত ফাংশনটি সর্বদা এটি চলমান যা চলকটিতে নিউলাইন যুক্ত করে। perlসংস্করণের ক্ষেত্রে এই সমস্যাটি দেখা দেয় না, যেহেতু -neপতাকা printক্রিয়াকলাপটি নতুন লাইন যুক্ত করে না।

তা সত্ত্বেও, ডাব্লু ঘোতি মন্তব্য হিসাবে উল্লিখিত হিসাবে অস্থায়ী পরিবর্তনশীল দৈর্ঘ্য যাচাই করা উচিত হিসাবে শর্তসাপেক্ষে ডেকে আউট করার ক্ষেত্রে স্থির করা হয়। একই ফিক্সের পার্ল সংস্করণটি হ'ল:

$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s if length $s}' input.txt 

1
আপনার ফিক্সটির নিজস্ব একটি সম্ভাব্য ছোটখাটো ত্রুটি রয়েছে কারণ এটি 'ভুল' সংখ্যক লাইনের ফাইলগুলির জন্য ফাঁকা আউটপুট যুক্ত করবে। আমি আপনার উত্তরটি উন্নত করার জন্য আমার সাথে এটি সংশোধন করেছি (এর জন্য awk) NR%3 == 0 { print; print delay; delay=""} END { if(length(delay) != 0 ) { print delay }
ডোপঘোতি

1
@ দোপগোতি এই সমস্যাটি পার্লের সাথে ঘটে না কারণ -neপতাকাগুলির সাথে পার্লের মুদ্রণটি কোনও নতুন লাইন আউটপুট দেয় না। এটি প্রকৃতপক্ষে মুদ্রণ করে, তবে এটি একটি নাল স্ট্রিং, কোনও নতুন লাইনের পিছনে নেই। তবুও, আমি আমার উত্তরটিতে সমস্যার উল্লেখ এবং একই ফিক্স যুক্ত করেছি। ধন্যবাদ!
সের্গেই কোলোডিয়াজনি

1

তেজ

দীর্ঘ ফাইলগুলির জন্য উপযুক্ত নয়, তবে আপনি যদি কেবল একটি ফাইল সম্পাদনা করতে চান এবং উদাহরণস্বরূপ, কিছু ইয়ামল স্ট্যানজাকে পুনরায় অর্ডার করতে চান তবে এখনও সহজ।

প্রথমে একটি ম্যাক্রো রেকর্ড করুন:

gg qq j ddp j q

এবং তারপরে কাঙ্ক্ষিত সংখ্যা পুনরাবৃত্তি করুন:

@q @q @q ...

বা ঠিক যেমন

3@q

ব্যাখ্যা:

  • জিজি - প্রথম লাইনে যান
  • কিউকিউ - একটি ম্যাক্রো রেকর্ডিং শুরু করুন
  • j - দ্বিতীয় লাইনে যান
  • ডিডিপি - দ্বিতীয় এবং তৃতীয় লাইনটি অদলবদল করুন
  • j - চতুর্থ লাইনে যান, অর্থাৎ পরবর্তী তিনটি লাইনের প্রথম দিকে যান
  • q - রেকর্ডিং বন্ধ করুন
  • @ কি - একবার ম্যাক্রো পুনরায় খেলুন
  • 3 @ কিউ - তিনবার ম্যাক্রো পুনরায় খেলুন

1
পরিবর্তে ম্যানুয়াল পুনরাবৃত্তি @q @q @q, এটি এইভাবে করা সম্ভব 3@q- তিনবার পুনরাবৃত্তি করুন। 100@q- ম্যাক্রোর 100 বার পুনরাবৃত্তি করুন।
মিনিম্যাক্স

0

ব্যবহার: ./shuffle_lines.awk input.txt

শেবাং পরীক্ষা করুন #!/usr/bin/awk -f, কারণ awkআপনার সিস্টেমে লোকেশন আলাদা হতে পারে।

#!/usr/bin/awk -f

{
    if ((NR + 1) % 3 == 0) {
        buffer = $0;
    } else if (NR % 3 == 0) {
        print $0 ORS buffer;
        buffer = "";
    } else {
        print;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.