“tac”를 사용하지 않고 파일에서 줄을 뒤로 인쇄하려면 어떻게해야합니까?

tac명령 을 사용하지 않고 파일에서 줄을 뒤로 인쇄하고 싶습니다 . bash로 그러한 일을하는 다른 해결책이 있습니까?



답변

sed에뮬레이션을 사용 하여 tac:

sed '1!G;h;$!d' ${inputfile}


답변

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

하나의 라이너 를 통해


답변

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 <somefile> | perl -e 'while(<>) { push @a, $_; } foreach (reverse(@a)) { print; }'


답변

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