উত্তর:
sed
অনুকরণ করতে ব্যবহার tac
:
sed '1!G;h;$!d' ${inputfile}
sed
ওয়ান-লাইনার। "36. লাইনের বিপরীত ক্রম (" ট্যাক "ইউনিক্স আদেশ অনুকরণ করুন)" দেখুন। মধ্যে বিখ্যাত ব্যান্ডউইডথ এক-বালিকা ব্যাখ্যা কিভাবে এটি কাজ করে একটি পূর্ণ ব্যাখ্যা জন্য।
sort
এটির ব্যবহার ব্যতীত - এটি একটি অস্থায়ী ফাইল ব্যবহার করার সুযোগ রয়েছে)।
সাথে ed
:
ed -s infile <<IN
g/^/m0
,p
q
IN
আপনার উপর হন, তাহলে BSD
/ OSX
(এবং আশা শীঘ্রই উপর GNU
/ linux
খুব যেমন এটা POSIX হতে হবে ):
tail -r infile
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
অ্যাজক ওয়ান লাইনারগুলির মাধ্যমে
awk 'a=$0RS a{}END{printf a}'
but your first
পার্ল বিপরীত <> `এই awk
উত্তরটির চেয়ে 10 বার দ্রুত (আমার কাছে) পৃষ্ঠায় এটি সেরা / দ্রুততম উত্তর (সমস্ত অবত আনসারগুলি একই,
awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
আপনি যেমন এটি ব্যাশে করতে বলেছিলেন, এখানে এমন একটি সমাধান দেওয়া হয়েছে যা খালি, সেড বা পার্ল ব্যবহার করে না, কেবল একটি ব্যাশ ফাংশন:
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
প্রত্যাশিত.
তবে সাবধান যে রেখাগুলি মেমরিতে সঞ্চিত থাকে, প্রতিটি ফাংশনটির পুনরাবৃত্তভাবে বলা লাইনগুলিকে। বড় ফাইলগুলির সাথে এত যত্নশীল।
আপনি এটি মাধ্যমে পাইপ করতে পারেন:
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
cat -n
অনেকটা এর মতোই কাজ করেawk '{print NR" "$0}'
পার্ল ইন:
cat <somefile> | perl -e 'while(<>) { push @a, $_; } foreach (reverse(@a)) { print; }'
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
:)
reverse<)
দ্রুত: ভাল! তবে লাইনের সংখ্যা বাড়ার সাথে সাথে "সত্যিই কুৎসিত" একটি অত্যন্ত ধীর গতির । !! ....
-n
সেখানে অতিমাত্রায় ছিল, ধন্যবাদ।
sort
)।
কেবলমাত্র সমাধান
ব্যাশ অ্যারেতে ফাইলটি পড়ুন (এক লাইনে = অ্যারের এক উপাদান) এবং বিপরীত ক্রমে অ্যারে প্রিন্ট করুন:
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
।
IFS=''
এবং করুন read -r
। আমি মনে করি ব্যাশ mapfile ARRAY_NAME
বিল্টিন যদিও অ্যারে পড়ার জন্য আরও ভাল সমাধান।
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
সমাধানের সাথে তুলনীয় , এবং অনুরোধ করা লাইনের সংখ্যা হ্রাস হওয়ায় দ্রুত হয়।
Simple do this with your file to sort the data in reverse order, and it should be unique.
সেড-এন '1 এ; 1 ডি; জি; এইচ; $ পি'
এখানে প্রদর্শিত হিসাবে:
echo 'e
> f
> a
> c
> ' | nl | sort -nr | sed -r 's/^ *[0-9]+\t//'
ফলাফল:
c a f e
awk '{print NR" "$0}' | sort -nr