ক্যাট কমান্ড দ্বারা ফাঁকা রেখা প্রদর্শন করুন


11

আমার নীচে ফাইলস টেক্সটের একটি তালিকা রয়েছে:

-rw-rw-r-- 1 root dev 11 May 16 12:18 20_SumActive.txt  
-rw-rw-r-- 1 root dev 11 May 16 12:18 22_SumActive.txt  
-rw-rw-r-- 1 root dev  7 May 16 12:18 24_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 26_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 28_SumActive.txt  

আউটপুট:

kpgmeddev01> cat 2[0-8]_SumActive.txt   
Sum: 47760  
Sum: 72000  
Sum: 0

নীচের মত আউটপুট কিভাবে পাবেন:

Sum: 47760  
Sum: 72000  
Sum: 0  
[Blank]  
[Blank]  

গাইডেন্স দরকার।


ফাইলগুলিতে কি আর এক লাইন থাকে ,?
রোয়াইমা

না, কেবল 1 টি লাইন
Fewong

1
উহ, আপনি যখন লিখেছেন [Blank]তখন আপনি কি এই characters টি অক্ষর বোঝাতে চেয়েছিলেন বা খালি রেখাটি নির্দেশ করার ইচ্ছা ছিল?
রোয়াইমা

1
বিড়াল ব্যবহার না করে। নিজের আত্মাকে বাধা দেবেন না।
ctrl-alt-delor

উত্তর:


20

catফাইলগুলিতে অস্তিত্ব নেই এমন ডেটা আউটপুট করতে পারে না। যদি কোনও ফাইল খালি থাকে তবে আউটপুট হিসাবে খালি লাইন সরবরাহ করার জন্য এটিতে একটি নতুন লাইন অক্ষরও নেই।

আপনি নিশ্চিত করতে পারেন যে ফাইলগুলিতে কমপক্ষে একটি নতুন লাইনের অক্ষর রয়েছে।

এটি awkনিশ্চিত করতে আপনি এইভাবে জিএনইউ ব্যবহার করেন (এটি খালি ফাইলগুলিকে সংশোধন করে):

awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt   

যে ENDFILEকোনও ফাইল পড়া শেষ করে ব্লকটি কার্যকর করা হবে। যদি FNRশূন্য হয় তবে আমরা ফাইলটিতে কোনও লাইন দেখতে পাইনি, সুতরাং আমরা এটিতে একটি নতুন লাইন .োকি। এরপরে স্ক্রিপ্টটি পরবর্তী ফাইলটি দিয়ে চালিয়ে যায়।

তারপরে আপনি প্রশ্নের catমতো করে ব্যবহার করতে পারেন ।


বিকল্পভাবে, ফাইলগুলি পরিবর্তন না করে GNU এর awk পরিবর্তে ব্যবহার করুন cat:

awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt

এটি উপরের মত খালি ফাইলগুলি সনাক্তকরণের একই ধরণের কাজ করে তবে ফাইলটির পরিবর্তে নতুন লাইনটি স্ট্যান্ডার্ড আউটপুটে মুদ্রণ করে। 1শেষে দ্বারা প্রতিস্থাপিত হতে পারে { print }এবং অ খালি ফাইল সমস্ত ডেটা outputted করা হবে।


বিকল্পভাবে, একটি শেল লুপ (যে কোনও POSIX শেলের মধ্যে কাজ করা উচিত):

for name in ./2[0-8]_SumActive.txt; do
    if [ -s "$name" ]; then
        cat "$name"
    else
        printf '\n'
    fi
done

-sপরীক্ষা সত্য হতে হবে ফাইল বিদ্যমান এবং শূন্য থেকে বড় একটি আকার বেশি।


যদি আপনি [Blank]খালি ফাইলগুলির জন্য আক্ষরিক স্ট্রিং আউটপুট করতে চান তবে উপরের \nকলগুলিতে কেবল সেই স্ট্রিংটি sertোকান (এটি কোডটিতেও printfকাজ করবে awk)।


2
পছন্দ করুন এটি যদি আপনার সমস্যার সমাধান করে তবে দয়া করে উত্তরটি গ্রহণ করার বিষয়টি বিবেচনা করুন
কুসালানন্দ

@ ফিওং: বা অন্য উত্তরটি গ্রহণ করুন যা আপনাকে আরও ভালভাবে সহায়তা করে - প্রতিটি টাইমজোনকে একটি সুযোগ দেওয়া ভাল অভ্যাস, তাই কোনও তাড়াহুড়ো নেই।
এমসাল্টার

পছন্দ করুন স্টিফেন একটি সংক্ষিপ্ত এবং কমপ্যাক্ট সমাধানও লিখেছেন, যা আশাব্যঞ্জক বলে মনে হচ্ছে।
কুসালানন্দ

@ কুসালানন্দ, ধন্যবাদ এবং আমি এটি কাজ করে দেখেছি।
কয়েক

16

সঙ্গে perl

perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt

যা শেষে অনুপস্থিত থাকলে একটি নিউলাইন চরিত্র যুক্ত করে, তাই খালি ফাইলগুলির জন্য একটি ফাঁকা লাইন আউটপুট দেয়, তবে খালি নথিভুক্ত ফাইলগুলির জন্য একটি নতুন লাইন যুক্ত করবে (এবং এটি একটি একক লাইনে সংক্ষেপিত হবে cat)।


সুন্দর পরামর্শ
#TugRul

13

(এটি আপনি যা চান ঠিক তা নয়, তবে :) এই ধরণের পরিস্থিতিতে আমি ব্যবহার করতে পছন্দ করি head

$ head -z 2[0-8]_SumActive.txt
==> 21_SumActive.txt <==
Sum: 47760  
Sum: 72000  
Sum: 0  

==> 22_SumActive.txt <==

==> 25_SumActive.txt <==

==> 28_SumActive.txt <==

সাধারণত এটি আপনি চান যদি না হয় sedতবে পরে এটি সহজ হয়


12

সাথে xargsএবং grepআপনি এর মতো কিছু চেষ্টা করতে পারেন:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]

4
সম্ভবত দ্রুততম সমাধান নয় (প্রতিটি ফাইলের জন্য শেল ফোর্কিং), তবে এখন পর্যন্ত কেবলমাত্র একটিই কাজ করবে যা যদি আপনার বর্তমান ডিরেক্টরিতে লক্ষ লক্ষ ফাইল থাকে (শেল বিস্তৃতি ব্যবহার না করে এবং এআরজিভি সীমাতে আঘাত না করে) আসলে কাজ করবে।
মাতিজা নালিস

1
@ মাটিজা নালিস: খুব সত্য! তবে আপনি সত্যিই 5 টি ফাইলের যত্ন নেবেন না।
ফ্লোহাইমেলে

6

ধরে নিচ্ছি যে আপনার দ্বারা [Blank]আক্ষরিক ফাঁকা রেখা বোঝানো হচ্ছে, এটি কাজ করা উচিত:

paste -s 2[0-8]_SumActive.txt

6

আপনি প্রতিটি ফাইলের বিষয়বস্তু প্রদর্শনের চেষ্টা করার আগে শূন্য দৈর্ঘ্য কিনা তা পরীক্ষা করতে পারেন:

for f in 2[0-8]_SumActive.txt;
do
    [[ -s "$f" ]] && awk 1 "$f" || echo '[Blank]'
done

আমি এর awk 1 "$f"পরিবর্তে ব্যবহার করেছি cat "$f"কারণ awkএকটি নিউলাইন দিয়ে কোনও ফাইলের আউটপুট শেষ করার গ্যারান্টি রয়েছে।

আপনার প্রশ্নে, আপনি যদি উদ্দেশ্য করেছিলেন যে [blank]এটি আক্ষরিক না হওয়া উচিত তবে কেবল একটি ফাঁকা রেখা, আপনি উপরের কোডটি ব্যবহার করে এবং বিবৃতিটির '[Blank]'শেষে থেকে সরিয়ে এটিকে প্রয়োগ করতে পারেন echo


5

আমি ধরে নিচ্ছি যে আপনার ফাইলগুলি 26_SumActive.txt এবং 28_SumActive.txt খালি রয়েছে এবং সেগুলির বিষয়বস্তু প্রদর্শন করার সময় আপনার ফাঁকা রেখাগুলি দরকার

এর জন্য, আপনি কেবল আপনার ফাইলগুলির তালিকার মাধ্যমে পুনরাবৃত্তি করতে পারেন এবং তাদের বিষয়বস্তুগুলি বিড়াল করতে পারেন এবং যদি ফাইলটি খালি থাকে তবে ফাঁকা লাইনটি প্রতিধ্বনি করুন।

[ -s FILE ] সত্য যদি FILE উপস্থিত থাকে এবং আকারটি শূন্যের চেয়ে বড় হয়।

$ for i in $(ls 2[0-8]_SumActive.txt) ; do  cat $i;  if [ ! -s $i ]; then echo -e ""; fi; done
Sum: 47760  
Sum: 72000  
Sum: 0  
[ Blank Line]
[ Blank Line ]

1
বা if [ -s $i ]; then cat $i; else echo -e ""; fi;। কেবল স্ট্যান্ডার্ড শেল কার্যকারিতা ব্যবহার করে একটি সাধারণ পরীক্ষার জন্য এখনও +1।
এমসাল্টাররা 16'18

2
বা কেবল cat "$i"; test -s "$i" || echo- এই অতিরঞ্জিত ifবা অ-বহনযোগ্য echoপতাকাগুলির দরকার নেই।
টবি স্পিড

1
cat 2[0-8]_SumActive.txt -

যেখানে - বিড়ালকে স্ট্যান্ডার্ড ইনপুট থেকে পড়তে সক্ষম করবে।

সুতরাং, আপনার ফাইলগুলির সামগ্রী প্রদর্শন করার পরে বিড়াল আপনার ইনপুটটির জন্য অপেক্ষা করবে। আক্ষরিক ফাঁকা বা [ফাঁকা] জন্য যা চান তা প্রবেশ করতে চাপ দিয়ে আপনি আপনার পছন্দসই ইনপুট তৈরি করতে পারেন। প্রতিটি ইনপুট প্রবেশের পরে, সমস্ত ইনপুট একবার ^ D (Ctrl + D) চাপুন এবং আপনার কাজ শেষ হয়ে যায়।

PS: প্রতিটি ইনপুট জন্য আপনি নিজ নিজ আউটপুট পাবেন।

cat 2[0-8]_SumActive.txt - 4[0-8]_SumActive.txt

এটির সাহায্যে খালি বা অন্য কিছু যা আপনি চান দুটি আউটপুট ক্রমের মধ্যে রাখতে পারবেন।


এই ভিত্তিতে আপনি কেবল catসমাধান হিসাবে প্রস্তাব দিতে পারেন এবং ওপিকে আপনার যা চান তা করার অনুমতি দিন।
রোয়াইমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.