POSIX 도구를 사용하여 파일 순서를 바꾸시겠습니까?

POSIX 도구를 사용하여 파일 순서를 바꾸시겠습니까?

깨끗하고 명확한 POSIX와 동등한 것이 있습니까 tac?

가독성과 간결성을 모두 고려해야 합니다.

답변1

가장 깨끗한POSIX동등하다

tail -r

~처럼

-r          Reverse. Copies lines from the specified starting point in
            the file in reverse order. The default for r is to print the
            entire file in reverse order.

다음에 수락됨POSIX질문(곧 모든 플랫폼에서 지원되길 바랍니다.)


이것이 가능 하지 tail -r않다면 (당신과 다른 사람들이 시연한 것처럼) "클래식" 텍스트 처리 도구를 성공적으로 사용하여 파일의 줄을 바꿀 수 있습니다.
가독성과 간결함은 제쳐두고, 오래된 것조차도 ed이것을 할 수 있습니다:

ed -s infile <<\IN
g/^/m0
,p
q
IN

또는 파이프의 출력을 반전시키려면 먼저 텍스트 버퍼로 읽어보세요.

ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN

답변2

sed"일반인"이 읽을 수는 없지만 다음과 같은 한 줄의 코드로 이 작업을 수행 할 수 있습니다 .

sed -n '1h;1!{x;H;};${g;p;}' file.txt

설명하다:

-nsed각 줄의 인쇄를 비활성화하는 기본 동작입니다.

1h첫 번째 행이 예약된 공간에 저장됩니다.

1!{...}이 명령 블록을 모든 줄에 적용와는 별개로첫 번째로.

x홀드 공간과 패턴 공간을 교환합니다. (패턴 공간은 각 라인이 처리될 때 저장되는 곳입니다.) H그런 다음 개행 문자가 예약된 공간에 추가되고 그 뒤에 패턴 공간의 (새) 내용이 추가됩니다.

${...}마지막 블록은 마지막 행에 도달한 경우에만 적용됩니다. g예약된 공간의 내용을 가져와서 패턴 공간에 넣고 p패턴 공간을 인쇄합니다.

물론 이는 전체 파일을 메모리에 한 번에 보관할 수 있는지 여부에 따라 달라집니다. 매우 큰 파일에서는 실패할 수 있습니다.

답변3

다음은 전체 파일을 메모리에 저장하는 awk 스크립트입니다.

awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' file

쉘 함수로 표현하면 다음과 같습니다.

tac () { awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' "$@"; }

답변4

POSIX vi당신은 있나요?편집하다또는전임자.

나는 선호한다어쨌든 결과를 보고 싶다면 직접 할 수 있습니다.

물론 명령 모드는 다음과 같습니다.

:g/^/m0

전체 파일을 되돌리고 싶지 않은 경우 콘텐츠가 이동되는 위치와 방법에 주의하는 한 언제든지 :ga 범위를 지정할 수 있습니다.

:1,10g/^/m0

ed다음을 사용하여 스크립트를 작성할 수 있습니다 .ex

$ ed -s infile <<IN
g/^/m0
,p
w
IN

그리고

$ ex -s infile <<EOS
g/^/move0
wq
EOS

나는 항상 이것을 한다.

"-r"은 다음으로 전환됩니다.꼬리게시 당시 POSIX와 호환되지 않음:

tail [-f] [-c number|-n number] [file]

관련 정보