অর্ডার রাখার সময় সংলগ্ন সদৃশ লাইনগুলি সরান


11

আমার কাছে একটি কলামযুক্ত একটি ফাইল রয়েছে যা প্রতিটি বারে বেশ কয়েকবার পুনরাবৃত্তি করে। একই নামের অন্য কোনও পুনরাবৃত্তি একই নামের অন্যান্য পুনরাবৃত্তির সাথে সংযুক্ত না রেখে, আমি প্রতিটি পুনরাবৃত্তি একটিকে একীভূত করতে চাই।

যেমন আমি বাম দিকটি ডান দিকে ঘুরিয়ে রাখতে চাই:

Golgb1    Golgb1    
Golgb1    Akna
Golgb1    Spata20
Golgb1    Golgb1
Golgb1    Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna

এটি আমি ব্যবহার করে যাচ্ছি: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt তবে, এই পদ্ধতিটি কেবল বাম দিক থেকে একজন প্রতিনিধি রাখে (যেমন গোলব 1 এবং আকনা পুনরাবৃত্তি হয় না)।

একাধিক, অ-সংলগ্ন ব্লকে পুনরাবৃত্তি করা নামগুলি রাখার সময়, প্রতিটি ব্লকের জন্য অনন্য নাম রাখার কোনও উপায় আছে কি?

উত্তর:


23

uniq আপনার জন্য এটি করবে:

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna

2
বাহ যে বিব্রতকরভাবে সহজ ছিল! ধন্যবাদ!
বয়স 87

@ বয়স 87 ইউনিক্স দুর্দান্ত! এটি কেবলমাত্র কাজ করে কারণ আপনি অনুলিপি সংলগ্ন, ইতিমধ্যে (বা, সংলগ্নগুলি অপসারণ করতে চান না) প্রত্যাশা করছেন। সাধারণত, প্রস্তাবটি ব্যবহার করার জন্য হয়sort | uniq
jpaugh

1
বা আরও সংক্ষিপ্তভাবে, sort -u(:
ডোপঘোটি

9

Awk সমাধান:

awk '$1 != name{ print }{ name = $1 }' file.txt

আউটপুট:

Golgb1
Akna
Spata20
Golgb1
Akna

6

এটি ব্যবহার করে দেখুন - পূর্ববর্তী লাইনটি সংরক্ষণ করুন এবং বর্তমান লাইনের সাথে তুলনা করুন

$ perl -ne 'print if $p ne $_; $p=$_' ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

আপনি uniqপাশাপাশি ট্যাগ করেছেন - আপনি এটি চেষ্টা করেছেন?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

1

সঙ্গে sed নিম্নরূপ এটি সম্পন্ন করা যেতে পারে:

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

এখানে যে কোনও সময় 2 লাইনের প্যাটার্ন স্পেসে রয়েছে। যখন তাদের মধ্যে তুলনা ব্যর্থ হয় আমরা প্রথমটি মুদ্রণ করি এবং সামনে থেকে এটি কাটা এবং ফিরে যাই এবং পরবর্তী লাইনটি প্যাটার্ন স্পেসে যুক্ত করি। পাখলান ... পুনরাবৃত্তি

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

perl -0777pe 's//$1/ while /^(.*\n)\1+/gm' input_file

0

রাকেশ শর্মার উদ্বেগ সমাধান সম্পর্কে প্রশ্ন।

আপনার যদি কোনও ইনপুট ফাইল থাকে যেমন:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.118 48.216
-126.128 48.222
-126.136 48.226

এবং আপনি একটি আউটপুট ফাইল হতে চান:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.128 48.222
-126.136 48.226

অনুপস্থিত নোট করুন:

-126.118 48.216

আমি জানি যে কমান্ডটি আমি চাই তা আপনার সমাধানের অনুরূপ:

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

উভয় কলাম মুদ্রণের জন্য এটি সঠিক উপায়ে পরিবর্তন করা যায় না এবং কলাম 2 মান সহ কেবল এই বিশেষ পদ্ধতিতে সাজানো যায়। কোন টিপস?


sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D' পরবর্তী পুনরাবৃত্তিকারী উপাদানগুলি মুছবে। দ্রষ্টব্য: এটি প্রয়োজন GNU sed। জন্য POSIXআচরণ, এটা সামান্য নড়চড় হবে।
রাকেশ শর্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.