जवाबों:
sed
अनुकरण करने के लिए उपयोग करना tac
:
sed '1!G;h;$!d' ${inputfile}
sed
वन-लाइनर है। "36. लाइनों का उल्टा क्रम देखें (" टैक "यूनिक्स कमांड) का अनुकरण करें।" में प्रसिद्ध Sed एक-लाइनर समझाया यह कैसे काम करता की पूरी जानकारी के लिए।
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 के माध्यम से
awk 'a=$0RS a{}END{printf a}'
but your first
perl रिवर्स <> `यह पृष्ठ पर सबसे अच्छा / सबसे तेज़ उत्तर है (मेरे लिए), इस awk
उत्तर की तुलना में 10 गुना तेज (सभी awk aseres एक ही, समय-वार हैं)
awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
जैसा कि आपने इसे बाश में करने के लिए कहा, यहाँ एक समाधान है जो awk, sed या perl का उपयोग नहीं करता है, बस एक bash:
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
उलटे क्रम, आंकिक शैली में पहले क्षेत्र (लाइन नंबर) पर छँटाई द्वारा लाइनों के आदेश को उलट देता है। और 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
)।
BASH- केवल समाधान
बैश एरे में फ़ाइल पढ़ें (एक लाइन = एरे का एक तत्व) और रिवर्स ऑर्डर में सरणी प्रिंट करें:
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
सभी प्रकार के पलायन को रोकने के लिए और IFS को हटाने से इसे हटाने से पीछे हटना। मुझे लगता है कि बैश 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.
sed -n '1h; 1d; G; h; $ p'
जैसा यहाँ दिखाया गया है:
echo 'e
> f
> a
> c
> ' | nl | sort -nr | sed -r 's/^ *[0-9]+\t//'
परिणाम:
c a f e