একটি ট্যাবে সীমিত ফাইলটিতে মানগুলির একটি কলাম যুক্ত করা


17

সুনির্দিষ্ট একটি সংখ্যক ফাইল থাকা অবস্থায় আমি কীভাবে মানগুলির একটি কলাম যুক্ত করতে পারি। আমার মতো একটি ইনপুট ফাইল রয়েছে:

ইনপুট ফাইল:

SPATA17 1   217947738
LYPLAL1 1   219383905
FAM47E  4   77192838
SHROOM3 4   77660162
SHROOM3 4   77660731
SHROOM3 4   77662248

আউটপুট ফাইল:

SPATA17 1   217947738 file1
LYPLAL1 1   219383905 file1
FAM47E  4   77192838  file1
SHROOM3 4   77660162  file1
SHROOM3 4   77660731  file1
SHROOM3 4   77662248  file1

এই ক্ষেত্রে, আমি ফাইলের সারি সংখ্যা পর্যন্ত মানগুলির একটি কলাম যুক্ত করতে চাই The মানটি সামঞ্জস্য থাকে, যেমন "ফাইল 1"।

কারণটি হ'ল আমার কাছে এই ফাইলগুলির মধ্যে 100 রয়েছে I আমি প্রতিটি ফাইল খুলতে এবং একটি কলাম আটকে দিতে চাই না। ডিরেক্টরিতে গিয়ে এবং মানগুলির একটি কলাম যুক্ত করে এটি স্বয়ংক্রিয় করার কোনও উপায় আছে। মানটি ফাইলের নাম থেকে আসে, যা শেষ / প্রথম কলামে ফাইলের প্রতিটি সারিতে যুক্ত করতে হয়।

উত্তর:


22

আপনি এই জাতীয় ওয়ান-লাইন ব্যবহার করতে পারেন:

for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done

তালিকার প্রতিটি ফাইলের জন্য, এটি sedপ্রতিটি লাইনের শেষে একটি ট্যাব এবং ফাইলের নাম যুক্ত করবে।

ব্যাখ্যা:

  • স্থানটিতে স্থান পরিবর্তন করতে -iপতাকাটি ব্যবহার sedকরে ফাইলটি ওভাররাইট করা
  • এর সাথে একটি প্রতিস্থাপন সম্পাদন করুন s/PATTERN/REPLACEMENT/। এই উদাহরণে PATTERN হ'ল $লাইনটির শেষ এবং REPLACEMENT হ'ল \t(= একটি ট্যাব), এবং $fলুপ ভেরিয়েবল থেকে ফাইলের নাম is s///যাতে শেল ভেরিয়েবল প্রসারিত করতে কমান্ড ডাবল কোট মধ্যে।

কোডটি কাজ করে? আপনি কি উদ্ধৃতিগুলির মধ্যে সামগ্রীগুলি ব্যাখ্যা করতে পারেন?
রন

কলামগুলির সাথে কাজ করার সময় যেমন "awk" ব্যবহার করা হয়, তেমনই একই পরিস্থিতিতে ব্যবহার করা হয় I আমি 'awk' এবং 'সেড' এর নবাগত।
রন

@ রন sedপ্যাটার্ন প্রতিস্থাপন এবং জায়গায় জায়গায় সংরক্ষণের জন্য সবচেয়ে কার্যকর। আপনার ফাইলটি সংরক্ষণের প্রয়োজনীয়তার জন্য এটি তুলনামূলকভাবে সুবিধাজনক বিকল্প ছিল। আপনি যদি একই ফাইলটি প্রক্রিয়াকরণ করছেন তবে আপনাকে আবার লেখার দরকার নেই, তবে awkএটির সাথে কাজ করা খুব সহজ।
janos

ব্যক্তিগতভাবে, আমি awkখুব ঘন ঘন ইনপুট / আউটপুট ফিল্ড বিভাজক দ্বারা বিভক্ত হয়ে যাই , এবং তাই যখনই সম্ভব সম্ভব হয়, এটিকে sedআরও আকর্ষণীয় করে এড়ানো চেষ্টা করি ।
ব্যবহারকারী5359531

11

আসুন যখন আপনি লোকেরা pasteকমান্ড থাকবে তখন কেন সেই শক্তিশালী সরঞ্জামগুলির প্রস্তাব দেয় !

$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A   1
B   2
C   3
D   4

কিছুটা ছলচাতুরী করে, আপনি pasteওপি এর উদ্দেশ্যে ব্যবহার করতে পারেন । তবে এটি ফাইলগুলিকে অন্তর্ভুক্ত করবে না:

for f in file1 file2 file3; do 
    paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done

এটি প্রতিটি ফাইলের শেষ কলাম হিসাবে সংশ্লিষ্ট ফাইলের নামটিকে নতুন ফাইলে পেস্ট করবে filename.new


ধন্যবাদ! pasteঅবশ্যই একটি লুকানো রত্ন।
neu242

10

আপনি ব্যবহার করতে পারেন awk:

awk '{print $0, FILENAME}' file1 file2 file3 ...

যেহেতু প্রতিটি ফাইলের আলাদা আলাদা নাম রয়েছে, তাই আমাকে এটি 100 বার করতে হবে onceএইবার করার কোনও উপায় আছে কি?
রন

না, FILENAMEএটি একটি চলক awk, এটি awkপ্রসেসিং করা বর্তমান ফাইলের নামটিতে প্রসারিত । আপনি কেবল এটি এক করুন, সমস্ত ফাইল এতে ফিড করুন awk
cuonglm

ঠিক আছে, তবে প্রতিটি ফাইলের আউটপুটকে কীভাবে নতুন ফাইলে ডাইরেক্ট করবেন? প্রসেসিংয়ের সময় প্রতিটি ফাইলকে কী কী অর্ক সংরক্ষণ করে?
রন

আপনার যদি GNU awk 4.1.0বা তার পরে থাকে তবে -iআপনি অন্তর্ভুক্ত সম্পাদনা করতে ব্যবহার করতে পারেন । অন্যথায়, আপনার awkআউটপুটটি একটি অস্থায়ী ফাইলে পুনর্নির্দেশ করা উচিত , তারপরে grepপ্রতিটি ফাইল থেকে লাইন বের করতে ব্যবহার করুন ।
cuonglm

ভাল আপনি করতে পারেনfor file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done
ফেডোরকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.