जवाबों:
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