আমি কীভাবে ফাইল থেকে পিছনে লাইনগুলি প্রিন্ট করতে পারি ("ট্যাক" ব্যবহার না করে)?


26

tacকমান্ড ব্যবহার না করেই কোনও ফাইল থেকে পিছনের দিকে লাইনগুলি মুদ্রণ করতে চাই । বাশ দিয়ে এ জাতীয় কাজ করার কি অন্য কোনও সমাধান আছে?


উত্তর:


33

sedঅনুকরণ করতে ব্যবহার tac:

sed '1!G;h;$!d' ${inputfile}

3
এটি একটি ভাল সমাধান তবে এটি কীভাবে আরও কার্যকর হবে তার কিছু ব্যাখ্যা।
চেন লেভি

10
এটি একটি বিখ্যাত sedওয়ান-লাইনার। "36. লাইনের বিপরীত ক্রম (" ট্যাক "ইউনিক্স আদেশ অনুকরণ করুন)" দেখুন। মধ্যে বিখ্যাত ব্যান্ডউইডথ এক-বালিকা ব্যাখ্যা কিভাবে এটি কাজ করে একটি পূর্ণ ব্যাখ্যা জন্য।
জনসিওয়েব

6
সম্ভবত লক্ষণীয়: "এই দুটি ওয়ান-লাইনারগুলি আসলে প্রচুর মেমরি ব্যবহার করে কারণ তারা পুরো ফাইলটি প্রিন্ট করার আগে বিপরীত ক্রমে রাখে। বড় ফাইলগুলির জন্য এই ওয়ান-লাইনারগুলি এড়িয়ে যান।"
মিঃ শিকাড্যান্স

সুতরাং অন্য সমস্ত উত্তরগুলি করুন (সম্ভবত sortএটির ব্যবহার ব্যতীত - এটি একটি অস্থায়ী ফাইল ব্যবহার করার সুযোগ রয়েছে)।
র্যান্ডম 832

1
নোট করুন নিয়মিত ফাইলগুলির জন্য ট্যাক দ্রুততর কারণ এটি ফাইলটি পিছনে পড়ে। পাইপগুলির জন্য, এটি অন্যান্য সমাধানগুলির মতোই করতে হয় (মেমোরিতে বা টেম্প ফাইলগুলিতে ধারণ করে), তাই উল্লেখযোগ্যভাবে দ্রুত হয় না।
স্টাফেন চেজেলাস


6

awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt

অ্যাজক ওয়ান লাইনারগুলির মাধ্যমে


4
একটি সংক্ষিপ্ততর:awk 'a=$0RS a{}END{printf a}'
নিনজালজ

@ নিনজালজ: এটি সংক্ষিপ্ত হতে পারে তবে ফাইলের আকার বড় হওয়ার সাথে সাথে এটি অত্যন্ত ধীর হয়ে যায় । আমি 2 মিনিট 30 সেকেন্ড অপেক্ষা করার পরে ছেড়ে দিয়েছি। but your first পার্ল বিপরীত <> `এই awkউত্তরটির চেয়ে 10 বার দ্রুত (আমার কাছে) পৃষ্ঠায় এটি সেরা / দ্রুততম উত্তর (সমস্ত অবত আনসারগুলি একই,
সময়ানুক্রমিক

1
বাawk '{a[NR]=$0} END {while (NR) print a[NR--]}'
স্টাফেন চেজেলাস

5

আপনি যেমন এটি ব্যাশে করতে বলেছিলেন, এখানে এমন একটি সমাধান দেওয়া হয়েছে যা খালি, সেড বা পার্ল ব্যবহার করে না, কেবল একটি ব্যাশ ফাংশন:

reverse ()
{
    local line
    if IFS= read -r line
    then
        reverse
        printf '%s\n' "$line"
    fi
}

এর আউটপুট

echo 'a
b
c
d
' | reverse

হয়

d
c
b
a

প্রত্যাশিত.

তবে সাবধান যে রেখাগুলি মেমরিতে সঞ্চিত থাকে, প্রতিটি ফাংশনটির পুনরাবৃত্তভাবে বলা লাইনগুলিকে। বড় ফাইলগুলির সাথে এত যত্নশীল।


1
অন্যান্য উত্তরগুলির চেয়ে ধীরতম তুলনায় ফাইলের আকার বাড়ার সাথে সাথে এটি অযৌক্তিকভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পরিণত হয় answers বিভাগ বিভাজন *
পিটার.ও

4

আপনি এটি মাধ্যমে পাইপ করতে পারেন:

awk '{print NR" "$0}' | sort -k1 -n -r | sed 's/^[^ ]* //g'

awkউপসর্গ লাইন সংখ্যা সঙ্গে প্রতিটি লাইন একটি স্থান দ্বারা অনুসরণ করে। sortবিপরীত ক্রম সাংখ্যিক শৈলী প্রথম ক্ষেত্র (লাইন নম্বর) উপর সাজানোর মাধ্যমে আপনাকে লাইনের অর্ডার reverses। এবং sedরেখা নম্বর বন্ধ রেখাচিত্রমালা।

নিম্নলিখিত উদাহরণটি এটি কার্যকরভাবে দেখায়:

pax$ echo 'a
b
c
d
e
f
g
h
i
j
k
l' | awk '{print NR" "$0}' | sort -k1 -n -r | sed 's/^[^ ]* //g'

এটি ফলাফল:

l
k
j
i
h
g
f
e
d
c
b
a

ঠিক আছে. ধন্যবাদ! আমি এটি চেষ্টা করব। এবং মন্তব্যের জন্য ধন্যবাদ!

5
cat -nঅনেকটা এর মতোই কাজ করেawk '{print NR" "$0}'
চেন লেভি

2
আমি মনে করি এটাকে শোয়ার্তজিয়ান ট্রান্সফর্ম , বা সাজসজ্জা-সাজানো সাজসজ্জা
নিনজালজ

এই সাধারণ পদ্ধতির ক্ষেত্রে এই কাজটি দুর্দান্ত হয় যদি ডেস্কে ফাইলগুলি ব্যবহার করে হ্যান্ডলগুলি পরিচালনা করা হয় যদি কাজটি মেমোরিতে যুক্তিসঙ্গতভাবে করার জন্য খুব বড় হয়। এটি মেমরির ক্ষেত্রে হালকা হতে পারে যদিও আপনি পাইপের পরিবর্তে পদক্ষেপগুলির মধ্যে অস্থায়ী ফাইলগুলি ব্যবহার করেন।
mc0e

1

পার্ল ইন:

cat <somefile> | perl -e 'while(<>) { push @a, $_; } foreach (reverse(@a)) { print; }'

2
বা সংক্ষিপ্তperl -e 'print reverse<>'
নিঞ্জালজ

2
(আসলে, এটি একটি সংক্ষিপ্ততর আছে, তবে এটি সত্যিই কুৎসিত, এর ভয়াবহতার সাক্ষী perl -pe '$\=$_.$\}{':)
নিনজালজ

@ ফ্রেডেরিক ডিভেরডট: দ্রুত, তবে এটি প্রথম লাইনটি হারাচ্ছে ... @ নিনজালজ: reverse<)দ্রুত: ভাল! তবে লাইনের সংখ্যা বাড়ার সাথে সাথে "সত্যিই কুৎসিত" একটি অত্যন্ত ধীর গতির । !! ....
পিটার.ও

@ পিটার.ও -nসেখানে অতিমাত্রায় ছিল, ধন্যবাদ।
ফ্রেডেরিক ডিয়ার্ড্ট

এটির সম্পর্কে দুর্দান্ত বিষয়টি হ'ল ফাইলের বিষয়বস্তুগুলি অগত্যা মেমরির মধ্যে পড়ে না (সম্ভবত কিছুক্ষণের বাইরে sort)।
কুসালানন্দ

0

কেবলমাত্র সমাধান

ব্যাশ অ্যারেতে ফাইলটি পড়ুন (এক লাইনে = অ্যারের এক উপাদান) এবং বিপরীত ক্রমে অ্যারে প্রিন্ট করুন:

i=0 

while read line[$i] ; do
    i=$(($i+1))
done < FILE


for (( i=${#line[@]}-1 ; i>=0 ; i-- )) ; do
    echo ${line[$i]}
done

ইন্ডেন্টেড রেখাগুলি দিয়ে এটি ব্যবহার করে দেখুন ... ফিলফ্রের সংস্করণটি আরও ভাল তবে এখনও পাঠ্য প্রক্রিয়াকরণের ক্ষেত্রে কখনই ব্যবহার করবেন না, তাই সত্যই সত্যই বলা যায় while..read
don_crissti

সমস্ত ধরণের পালিয়ে যাওয়া এবং আইএফএস অপসারণটি এটির দিকে চালিত থেকে আটকাতে ব্যবহার করুন IFS=''এবং করুন read -r। আমি মনে করি ব্যাশ mapfile ARRAY_NAMEবিল্টিন যদিও অ্যারে পড়ার জন্য আরও ভাল সমাধান।
আর্থার 2e5

0

mapfileফিক্সিম্যানের মন্তব্যে উল্লিখিত বাশ, এবং সম্ভবত একটি সম্ভবত আরও ভাল সংস্করণ:

# last [LINES=50]
_last_flush(){ BUF=("${BUF[@]:$(($1-LINES)):$1}"); } # flush the lines, can be slow.
last(){
  local LINES="${1:-10}" BUF
  ((LINES)) || return 2
  mapfile -C _last_flush -c $(( (LINES<5000) ? 5000 : LINES+5 )) BUF
  BUF=("${BUF[@]}") # Make sure the array subscripts make sence, can be slow.
  ((LINES="${#BUF[@]}" > LINES ? LINES : "${#BUF[@]}"))
  for ((i="${#BUF[@]}"; i>"${#BUF[@]}"-LINES; i--)); do echo -n "${BUF[i]}"; done
}

এর কর্মক্ষমতাটি মূলত sedসমাধানের সাথে তুলনীয় , এবং অনুরোধ করা লাইনের সংখ্যা হ্রাস হওয়ায় দ্রুত হয়।



0
  • এনএল দিয়ে রেখাগুলি সংখ্যা
  • বিপরীতে ক্রম অনুসারে সংখ্যা অনুসারে সাজান
  • শেড দিয়ে নম্বরগুলি সরিয়ে দিন

এখানে প্রদর্শিত হিসাবে:

echo 'e
> f
> a
> c
> ' | nl | sort -nr | sed -r 's/^ *[0-9]+\t//'

ফলাফল:

c
a
f
e

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