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


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.