답변:
sed
에뮬레이션을 사용 하여 tac
:
sed '1!G;h;$!d' ${inputfile}
sed
원 라이너입니다. "36. 라인의 역순 ("tac "Unix 명령 에뮬레이션)을 참조하십시오." 에서 유명한 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 'a=$0RS a{}END{printf a}'
but your first
perl reverse <>`이 awk
답변 보다 10 배 빠르며 페이지에서 가장 빠르거나 가장 빠른 답변입니다 (모든 aks anseres는 시간에 따라 거의 동일합니다)
awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
bash에서 요청한 것처럼 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<)
빠르지 만 첫 번째 줄을 잃습니다 ... @ ninjalj : 빠릅니다 : 좋습니다! 그러나 "정말 못생긴"것은 줄의 수가 증가함에 따라 매우 느립니다 . !! ....
-n
거기에 불필요한 것이 었습니다. 감사합니다.
sort
.
BASH 전용 솔루션
bash 배열로 파일을 읽고 (한 줄 = array의 한 요소) 배열을 역순으로 인쇄하십시오.
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 제거를 후행한다. bash mapfile ARRAY_NAME
내장 기능이 배열을 읽는 데 더 나은 솔루션 이라고 생각합니다 .
Bash, mapfile
fiximan에 대한 의견에 언급되었으며 실제로 더 나은 버전입니다.
# 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
솔루션 과 비슷하며 요청 된 줄 수가 줄어들면 더 빨라집니다.