শেল স্ক্রিপ্ট ব্যবহার করে কীভাবে পাঠ্য ফাইলে কলামেটেড ফাইলে মানগুলি প্রিন্ট করা যায়


11

শেল স্ক্রিপ্টটি চালানো থেকে আমার কাছে আউটপুট.সেক্সট রয়েছে:

abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

পাঠ্য ফাইলটিতে একই পদ্ধতিতে একাধিক এন্ট্রি রয়েছে line আমি এই মানগুলি কলামগুলিতে মুদ্রণ করতে চাই: ফাইলের নাম, স্থিতি এবং টাইমস্ট্যাম্প নীচে:

Filename      Status        Timestamp
abc.txt     errorstatus1   Fri Nov 11 02:00:09 2016
def.txt     errorstatus2   Sat Nov 12 03:00:09 2016

4
উদাহরণ ফর্ম্যাটটি কোনও সিএসভি ফাইল নয়, এটি একটি স্থির-কলাম-প্রস্থের ফাইল। আপনি প্রশ্নটি স্পষ্ট করতে বা একটি সঠিক উদাহরণ সরবরাহ করতে চাইতে পারেন।
— অ্যালেক্সপ

তোমার উদাহরণ না একটি জীবনবৃত্তান্ত বিন্যাস। সিভিএস ফর্ম্যাটটি abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016। আপনার দেওয়া উদাহরণের সাথে এটি যা বলে তাতে মেলে আমি আপনার প্রশ্ন সম্পাদনা করেছি। রোল ব্যাক নির্দ্বিধায় কিন্তু দয়া করে মনে রাখবেন আপনি কি সত্যিই নির্মল ঠিক চাও প্রয়োজন - columnated মান বা কমা দ্বারা পৃথক মান
— Sergiy Kolodyazhnyy

উত্তর:


14

সহ paste:

paste - - - <file.txt

এটি কলাম হিসাবে নিউলাইন দ্বারা পৃথক করা ফাইল সামগ্রী এবং প্রতি লাইনে তিনটি ট্যাব বিভাজিত কলামগুলি আউটপুট দেবে।

শিরোনাম যুক্ত করা হচ্ছে:

echo Filename Status Timestamp; paste - - - <file.txt

আউটপুটটি কলামাইজ করতে, এর থেকে সহায়তা নিন column:

{ echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t

উদাহরণ:

% cat file.txt
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

% { echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t
Filename  Status            Timestamp
abc.txt   errorstatus1      Fri        Nov  11  02:00:09  2016
def.txt   errorstatus2.txt  Sat        Nov  12  03:00:09  2016

শান্ত! ধন্যবাদ !! তবে কীভাবে এই মানগুলি এক্সেল বিন্যাসে মুদ্রণ করবেন। আমি এক্সেল শিটের কলাম শিরোনামগুলিকে ফাইলের নাম স্থিতি এবং টাইমস্ট্যাম্প এবং তাদের নীচের মানগুলি চাই
— linux09

@ লিনাক্স09 একটি সিএসভি তৈরি করুন এবং এক্সেল সহ আমদানি করুন:echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
— হিমাইল

উজ্জ্বল! একটি যাদুমন্ত্র মত কাজ করে. আপনাকে অনেক ধন্যবাদ
— linux09

6

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

awk 'NR % 3 {printf "%s ", $0; next}1'

আউটপুটটি এত সুন্দর হতে পারে না:

$ awk 'NR % 3 {printf "%s ", $0; next} 1' input
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2.txt Sat Nov 12 03:00:09 2016

আপনি তার %s\tপরিবর্তে ট্যাব-বিভাজিত আউটপুট ব্যবহার করতে পারেন ।

  • NR % 3প্রতি তৃতীয় লাইনের জন্য শূন্য (এবং মিথ্যা), সুতরাং অন্যান্য রেখাগুলি একটি নতুন লাইনের পরিবর্তে তাদের পরে একটি স্পেস দিয়ে মুদ্রণ করা হবে। nextশুধু পরবর্তী পুনরাবৃত্তি শুরু।
  • প্রতি তৃতীয় লাইনটি ফাইনালের কারণে প্রিন্ট করা হয় 1, এর পরে একটি নতুন লাইন থাকে কারণ এটি প্রথম ব্লকের সাথে মেলে না।

5

এছাড়াও রয়েছে rs(BSD r e s hape ইউটিলিটি):

DESCRIPTION
     rs reads the standard input, interpreting each line as a row of blank-
     separated entries in an array, transforms the array according to the
     options, and writes it on the standard output.  With no arguments it
     transforms stream input into a columnar format convenient for terminal
     viewing.

নির্দিষ্টভাবে,

     -e      Consider each line of input as an array entry.

সুতরাং

$ rs -e < file
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

বা (শিরোনাম যুক্ত করতে)

$ { printf '%s\n' Filename Status Timestamp ; cat file ; } | rs -e
Filename                  Status                    Timestamp
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

3

সম্পূর্ণতার জন্য, আপনি এটি দিয়ে sedএটিও করতে পারেন :

sed -e '1iFilename\tStatus\tTimestamp' -e 'N;N;y/\n/\t/' file.txt
  • 1iFilename\tStatus\tTimestamp লাইন 1 এর আগে শিরোনাম লাইন সন্নিবেশ করান
  • N;N মোট তিনটি নতুন লাইন বিভাজিত রেখা প্রদান করে, প্যাটার্ন বাফারে আরও দুটি লাইন পড়ে
  • y/\n/\t/ প্যাটার্ন বাফারে ট্যাবগুলির সাথে সমস্ত নিউলাইনগুলি প্রতিস্থাপন করে

i, Nএবং ysed কমান্ড এখানে নথিভুক্ত করা হয় ।


দুর্দান্ত .. আপনি কীভাবে প্রকাশ করেছেন তা সম্পর্কে সংক্ষেপে মন্তব্য করতে পারো? ধন্যবাদ!
— ক্যাম্পা

হ্যাঁ, নিখুঁত শহরবাসী
— Campa

1

এডাব্লুকে বা পার্ল দিয়ে পাঠ্য প্রক্রিয়াজাতকরণের জন্য কিছু অবশ্যই রান্না করা সম্ভব এবং অবশ্যই পাইথন যা এই উত্তরটি সরবরাহ করে।

ওয়ান-লাইনার হিসাবে:

python -c 'import sys;print "Filename\tStatus\tTimestamp"; lines=[l.strip() for l in sys.stdin];print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt

মাল্টি-লাইন স্ক্রিপ্ট হিসাবে

import sys
print "Filename\tStatus\tTimestamp"
lines=[l.strip() for l in sys.stdin]
print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])

মূল ধারণাটি হ'ল স্টিডিনের মাধ্যমে স্ক্রিপ্ট ইনপুট দেওয়া (শেলটির পুনঃনির্দেশ ব্যবহার করে <, যদিও পাইপটিও ব্যবহার করা যায়)। স্ক্রিপ্টটি ক্ষেত্রগুলি পৃথক করতে ট্যাবগুলি ব্যবহার করে, যদিও স্পেসগুলি আরও "সূক্ষ্ম-সুরযুক্ত" আউটপুট হিসাবে ব্যবহার করা যেতে পারে।

ওপেন দ্বারা সরবরাহ করা ইনপুট উদাহরণ ব্যবহার করে নমুনা আউটপুট:

$ python -c 'import sys;print "Filename\tStatus\tTimestamp";                                   
> lines=[l.strip() for l in sys.stdin];
> print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt
Filename    Status  Timestamp
abc.txt errorstatus1    Fri Nov 11 02:00:09 2016
def.txt errorstatus2    Sat Nov 12 03:00:09 2016
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.