আমি প্রতিটি লাইনের বিষয়বস্তু সংরক্ষণ করে একটি পাঠ্য ফাইলে (বা স্টিডিন) লাইনের ক্রমটি বিপরীত করতে চাই।
সুতরাং, অর্থাত:
foo
bar
baz
আমি শেষ করতে চাই
baz
bar
foo
এর জন্য কি কোনও মানক UNIX কমান্ডলাইন ইউটিলিটি রয়েছে?
আমি প্রতিটি লাইনের বিষয়বস্তু সংরক্ষণ করে একটি পাঠ্য ফাইলে (বা স্টিডিন) লাইনের ক্রমটি বিপরীত করতে চাই।
সুতরাং, অর্থাত:
foo
bar
baz
আমি শেষ করতে চাই
baz
bar
foo
এর জন্য কি কোনও মানক UNIX কমান্ডলাইন ইউটিলিটি রয়েছে?
উত্তর:
বিএসডি লেজ:
tail -r myfile.txt
তথ্যসূত্র: ফ্রিবিএসডি , নেটবিএসডি , ওপেনবিএসডি এবং ওএস এক্স ম্যানুয়াল পৃষ্ঠাগুলি।
এছাড়াও উল্লেখযোগ্য: tac(দ্য, আহেম, বিপরীত cat)। কোর্টিলের অংশ ।
tac a.txt > b.txt
brew install coreutils( gtacডিফল্ট হিসাবে ইনস্টল ) ব্যবহার করে ইনস্টল করতে পারেন ।
echo -n "abc\ndee" > test; tac test।
এখানে সুপরিচিত সেড ট্রিকস রয়েছে :
# reverse order of lines (emulates "tac")
# bug/feature in HHsed v1.5 causes blank lines to be deleted
sed '1!G;h;$!d' # method 1
sed -n '1!G;h;$p' # method 2
(ব্যাখ্যা: বাফার ধরে রাখতে, অদলবদল করে এবং বাফার ধরে রাখতে, শেষে লাইনটি প্রিন্ট করতে প্রারম্ভিক)
বিকল্পভাবে (দ্রুত প্রয়োগের সাথে) ডাব্লু ওয়ান-লাইনারগুলি থেকে :
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file*
যদি আপনি এটি মনে করতে না পারেন,
perl -e 'print reverse <>'
জিএনইউ ইউটিলিটি সহ একটি সিস্টেমে অন্যান্য উত্তরগুলি সহজ, তবে সমস্ত বিশ্ব জিএনইউ / লিনাক্স নয় ...
tail -r।
tacমনে করা যায় যে স্বেচ্ছাসেবী বড় ফাইলগুলি মেমরির সাথে খাপ খায় না (লাইনের দৈর্ঘ্য এখনও সীমাবদ্ধ)। এই sedজাতীয় ফাইলগুলির জন্য সমাধান কাজ করে কিনা তা স্পষ্ট নয় ।
আপনার আদেশের শেষে লিখুন:
| tac
ট্যাক ঠিক আপনি যা যা চেয়েছিলেন তা করে, এটি "প্রতিটি ফাইলকে প্রথমে শেষ লাইনে স্ট্যান্ডার্ড আউটপুটে লিখুন।"
ট্যাক বিড়ালের বিপরীতে :-)।
tacকমান্ডটির মান ব্যাখ্যা করুন, এটি নতুন ব্যবহারকারীদের জন্য দরকারী যারা একই বিষয় অনুসন্ধান করতে পারে।
আপনি যদি vimব্যবহারে হয়ে থাকেন
:g/^/m0
$ (tac 2> /dev/null || tail -r)
চেষ্টা করুন tac, যা লিনাক্সে কাজ করে এবং যদি এটি ব্যবহার না করে tail -r, যা BSD এবং OSX এ কাজ করে।
tac myfile.txt- আমি কী মিস করছি?
tail -rযদি tacপাওয়া যায় না। tacপসিক্স অনুগত নয়। না হয় tail -r। তবুও নির্বোধ নয়, তবে এটি কাজ করার প্রতিক্রিয়ার উন্নতি করে।
tacউপলভ্য হয় তবে কী হয় , তবে র্যামের বাইরে চলে যায় এবং একটি বিশাল ইনপুট স্ট্রিম গ্রহণের অর্ধেক পথ অদলবদল করে। এটি ব্যর্থ হয় এবং এরপরে tail -rস্ট্রিমের বাকী অংশগুলিকে একটি ভুল ফলাফল দিয়ে সাফল্য অর্জন করে।
brew install coreutils এবং gtacএর জায়গায় ব্যবহার করুন tacএবং যদি আপনার পছন্দসই একটি উপাধি হিসাবে টাক যুক্ত হয় gtacতবে উদাহরণস্বরূপ আপনি শেল স্ক্রিপ্ট চেয়েছিলেন যা এটি প্ল্যাটফর্ম (লিনাক্স, ওএসএক্স) ব্যবহার করেছে
নিম্নলিখিত কমান্ড চেষ্টা করুন:
grep -n "" myfile.txt | sort -r -n | gawk -F : "{ print $2 }"
sed 's/^[0-9]*://g'
nlডিফল্টরূপে খালি লাইন সংখ্যা ব্যর্থ করবে। -baবিকল্প কিছু সিস্টেমে উপলব্ধ না সার্বজনীন নয় (যদিও আমার খুব একটা ইচ্ছা হবে না এইচপি / ইউএক্স, মনে আসে) আর grep -nহবে সবসময় সংখ্যা যে লাইন যে (এই ক্ষেত্রে খালি) Regex সাথে মেলে।
cut -d: -f2-
জাস্ট বাশ :) (4.0+)
function print_reversed {
local lines i
readarray -t lines
for (( i = ${#lines[@]}; i--; )); do
printf '%s\n' "${lines[i]}"
done
}
print_reversed < file
-neneneneneneneব্যবহার করে দেখুন এবং লোকেরা সর্বদা এর printf '%s\n'পরিবর্তে কেন ব্যবহারের পরামর্শ দেয় তার কারণ প্রত্যক্ষ করুন echo।
সবচেয়ে সহজ পদ্ধতিটি tacকমান্ডটি ব্যবহার করা হচ্ছে । tacহয় catএর বিপরীত। উদাহরণ:
$ cat order.txt
roger shah
armin van buuren
fpga vhdl arduino c++ java gridgain
$ tac order.txt > inverted_file.txt
$ cat inverted_file.txt
fpga vhdl arduino c++ java gridgain
armin van buuren
roger shah
আমি সত্যিই " টেল-আর " উত্তরটি পছন্দ করি তবে আমার প্রিয় গোক উত্তরটি ....
gawk '{ L[n++] = $0 }
END { while(n--)
print L[n] }' file
mawkউবুন্টু 14.04 এলটিএস-এর সাথে পরীক্ষিত - কাজ করে, তাই এটি জিএনইউ অ্যাডক নির্দিষ্ট নয়। +1
n++NR
নিম্নলিখিতটি সম্পাদনা করুন 1 থেকে 10 পর্যন্ত এলোমেলোভাবে সাজানো সংখ্যার তালিকা তৈরি করে:
seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') **...**
যেখানে বিন্দুগুলি প্রকৃত কমান্ডের সাথে প্রতিস্থাপন করা হয় যা তালিকার বিপরীতে
Tac
seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \
<(tac)
অজগর: sys.stdin এ [:: - 1] ব্যবহার করে
seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \
<(python -c "import sys; print(''.join(([line for line in sys.stdin])[::-1]))")
ক্রস ওএস (অর্থাত্ ওএসএক্স, লিনাক্স) সমাধানের জন্য যা ব্যবহার করতে পারে tac শেল স্ক্রিপ্টের অভ্যন্তরে অন্যরা উপরে উল্লিখিতভাবে হোমব্রিউ ব্যবহার করে, তবে কেবল ওরফে ট্যাকটি এর মতো:
ইনস্টল করুন
ম্যাকোসের জন্য
brew install coreutils
লিনাক্স ডিবিয়ানদের জন্য
sudo apt-get update
sudo apt-get install coreutils
তারপরে উপনাম যুক্ত করুন
echo "alias tac='gtac'" >> ~/.bash_aliases (or wherever you load aliases)
source ~/.bash_aliases
tac myfile.txt
আপনি যদি জায়গাটিতে ফাইলটি পরিবর্তন করতে চান তবে আপনি চালাতে পারেন can
sed -i '1!G;h;$!d' filename
এটি একটি অস্থায়ী ফাইল তৈরি করার প্রয়োজনটিকে সরিয়ে দেয় এবং তারপরে মূলটি মুছুন বা পুনরায় নামকরণ করুন এবং একই ফলস্বরূপ। উদাহরণ স্বরূপ:
$tac file > file2
$sed -i '1!G;h;$!d' file
$diff file file2
$
উপর ভিত্তি করে ephemient দ্বারা উত্তর , যা করেনি প্রায়, কিন্তু বেশ, আমি কি চেয়েছিলাম।
আমার সাথে এটি ঘটে যে আমি nখুব বড় টেক্সট ফাইলের শেষ লাইনগুলি দক্ষতার সাথে পেতে চাই ।
প্রথম জিনিসটি আমি চেষ্টা করেছিলাম tail -n 10000000 file.txt > ans.txtতবে এটি আমি খুব ধীর পেয়েছিtail এর জন্য লোকেশনটি অনুসন্ধান করতে হবে এবং তারপরে ফলাফলগুলি মুদ্রণের জন্য ফিরে যেতে হবে।
যখন আমি এটা বুঝতে, আমি অন্য সমাধান স্যুইচ: tac file.txt | head -n 10000000 > ans.txt। এবার, সন্ধানের অবস্থানটি কেবল শেষ থেকে পছন্দসই স্থানে যেতে হবে এবং এটি 50% সময় সাশ্রয় করে !
হোম বার্তা নিয়ে:
tac file.txt | head -n nআপনার বিকল্প tailনা থাকলে ব্যবহার করুন -r।
সবচেয়ে ভালো সমাধান:
tail -n20 file.txt | tac
ইমাক্স ব্যবহারকারীদের জন্য: C-x h(পুরো ফাইলটি নির্বাচন করুন) এবং তারপরে M-x reverse-region। এছাড়াও কেবলমাত্র অংশ বা রেখাগুলি বাছাই এবং সেগুলি আবার ফিরিয়ে আনতে কাজ করে।
আমার একই প্রশ্ন ছিল, তবে আমি প্রথম লাইনে (শিরোলেখ) শীর্ষে থাকতে চেয়েছিলাম। সুতরাং আমার কাছে অ্যাডকের শক্তি ব্যবহার করা দরকার
cat dax-weekly.csv | awk '1 { last = NR; line[last] = $0; } END { print line[1]; for (i = last; i > 1; i--) { print line[i]; } }'
পিএস সাইগউইন বা গিটব্যাশ-এও কাজ করে
1\n20\n19...2\nপরিবর্তে ফলাফল প্রদর্শিত হবে 20\n19...\2\n1\n।
আপনার সাথে এটা করতে পারেন vim stdinএবং stdout। আপনি পসিক্স অনুগত হতেও ব্যবহার exকরতে পারেন । এর জন্য কেবল ভিজ্যুয়াল মোড । আসলে, আপনি বা (উন্নত মোড) এর সাথে ব্যবহার করতে পারেন ।
এটি কার্যকর কারণ কারণ এর মতো সরঞ্জামগুলি ফাইল সম্পাদনার জন্য বাফার করে, যখন প্রবাহের জন্য ব্যবহৃত হয়। আপনি ব্যবহার করতে সক্ষম হতে পারেন , তবে আপনাকে একটি চলকটিতে ম্যানুয়ালি বাফার করতে হবে।vimexexvim -evim -Eexvimsedsedawk
নিম্নলিখিতটি করার জন্য ধারণাটি হ'ল:
g/^/m0। এর অর্থ প্রতিটি স্তরের জন্য বিশ্বব্যাপী g; লাইনের সূচনাটি মিলবে, যা কোনও কিছুর সাথে মেলে ^; এটিকে ঠিকানা 0 এর পরে সরান, যা লাইন 1 m0।%p। এর অর্থ সমস্ত লাইনের পরিসীমা %; লাইন মুদ্রণ করুন p।q!। এর অর্থ ছাড় q; জোর করে !।# Generate a newline delimited sequence of 1 to 10
$ seq 10
1
2
3
4
5
6
7
8
9
10
# Use - to read from stdin.
# vim has a delay and annoying 'Vim: Reading from stdin...' output
# if you use - to read from stdin. Use --not-a-term to hide output.
# --not-a-term requires vim 8.0.1308 (Nov 2017)
# Use -E for improved ex mode. -e would work here too since I'm not
# using any improved ex mode features.
# each of the commands I explained above are specified with a + sign
# and are run sequentially.
$ seq 10 | vim - --not-a-term -Es +'g/^/m0' +'%p' +'q!'
10
9
8
7
6
5
4
3
2
1
# non improved ex mode works here too, -e.
$ seq 10 | vim - --not-a-term -es +'g/^/m0' +'%p' +'q!'
# If you don't have --not-a-term, use /dev/stdin
seq 10 | vim -E +'g/^/m0' +'%p' +'q!' /dev/stdin
# POSIX compliant (maybe)
# POSIX compliant ex doesn't allow using + sign to specify commands.
# It also might not allow running multiple commands sequentially.
# The docs say "Implementations may support more than a single -c"
# If yours does support multiple -c
$ seq 10 | ex -c "execute -c 'g/^/m0' -c '%p' -c 'q!' /dev/stdin
# If not, you can chain them with the bar, |. This is same as shell
# piping. It's more like shell semi-colon, ;.
# The g command consumes the |, so you can use execute to prevent that.
# Not sure if execute and | is POSIX compliant.
seq 10 | ex -c "execute 'g/^/m0' | %p | q!" /dev/stdin
কীভাবে এটি পুনরায় ব্যবহারযোগ্য করে তোলা যায়
আমি সম্পাদনা করতে ভিএম ব্যবহার করতে আমি কল করি একটি স্ক্রিপ্ট ved(ভিএম সম্পাদক পছন্দ করি sed) ব্যবহার করি stdin। vedআপনার পথে ডাকা একটি ফাইলে এটি যুক্ত করুন:
#!/usr/bin/env sh
vim - --not-a-term -Es "$@" +'%p | q!'
আমি এর +পরিবর্তে একটি কমান্ড ব্যবহার করছি +'%p' +'q!', কারণ ভিএম আপনাকে 10 কমান্ডের মধ্যে সীমাবদ্ধ করে। সুতরাং তাদের মার্জ করে "$@"9 করার অনুমতি দেয়+ টির পরিবর্তে কমান্ড পাওয়া যায়।
তারপরে আপনি এটি করতে পারেন:
seq 10 | ved +'g/^/m0'
আপনার যদি ভিম 8 না থাকে তবে এটির vedপরিবর্তে এটি রাখুন:
#!/usr/bin/env sh
vim -E "$@" +'%p | q!' /dev/stdin
rev
text here
অথবা
rev <file>
অথবা
rev texthere
sort -r < filename
অথবা
rev < filename
sort -rকেবলমাত্র যদি ইনপুটটি ইতিমধ্যে বাছাই করা হয় তবে এটি কাজ করে। revপ্রতি লাইনে অক্ষরকে বিপরীত করে তবে লাইন ক্রম অক্ষুণ্ন রাখে যা স্কটি যা চেয়েছিল তা নয়। সুতরাং এই উত্তর আসলে কোন উত্তর নেই।
perl -e 'print reverse <>'তবে এটি সম্ভবত অন্যান্য পদ্ধতির ক্ষেত্রেও প্রযোজ্য)।