আমি প্রতিটি লাইনের বিষয়বস্তু সংরক্ষণ করে একটি পাঠ্য ফাইলে (বা স্টিডিন) লাইনের ক্রমটি বিপরীত করতে চাই।
সুতরাং, অর্থাত:
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
করতে পারেন । এর জন্য কেবল ভিজ্যুয়াল মোড । আসলে, আপনি বা (উন্নত মোড) এর সাথে ব্যবহার করতে পারেন ।
এটি কার্যকর কারণ কারণ এর মতো সরঞ্জামগুলি ফাইল সম্পাদনার জন্য বাফার করে, যখন প্রবাহের জন্য ব্যবহৃত হয়। আপনি ব্যবহার করতে সক্ষম হতে পারেন , তবে আপনাকে একটি চলকটিতে ম্যানুয়ালি বাফার করতে হবে।vim
ex
ex
vim -e
vim -E
ex
vim
sed
sed
awk
নিম্নলিখিতটি করার জন্য ধারণাটি হ'ল:
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 <>'
তবে এটি সম্ভবত অন্যান্য পদ্ধতির ক্ষেত্রেও প্রযোজ্য)।