방금 내가 해결할 수 있다는 걸 깨달았어요이 문제행 번호를 1, 2, 3,...,n에서 n, n-1, ..., 3,2,1로 바꾼 다음 이전과 동일한 논리를 사용합니다. 그럼 행의 순서를 바꾸는 방법을 알고 싶습니다.
답변1
tac
( cat
역방향, 또한 포함 coreutils
) cat
은 파일을 역순으로 정렬합니다.
$ cat /tmp/test
One
Two
Three
$ tac /tmp/test
Three
Two
One
(당신이 언급한 특정 문제의 경우 파일을 추가하고 전체 파일을 다시 되돌릴 수 있도록 전체 파일을 반전하는 것보다 해결 방법이 더 좋습니다)
답변2
특정 문제의 경우 이는 문제를 해결하는 가장 효율적인 방법은 아니지만 다음 방법 중 하나를 사용하여 다양한 이식성 수준으로 역순으로 줄이 있는 파일을 인쇄할 수 있습니다( tac
예: 기본적으로는 포함되지 않음 유닉스):
sed '1!G;h;$!d' [file]
awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' [file]
perl -e 'print reverse<>' [file]
tac [file]
내 시스템에서 가장 빠른 것은 다음 tac
과 같이 테스트되었습니다.
$ printf '%s\n' {a..z}{a..z}{a..z} > foo
$ time sed '1!G;h;$!d' foo > /dev/null 2>&1
real 0m0.582s
user 0m0.544s
sys 0m0.012s
$ time awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' foo > /dev/null 2>&1
real 0m0.060s
user 0m0.052s
sys 0m0.008s
$ time perl -e 'print reverse<>' foo > /dev/null 2>&1
real 0m0.021s
user 0m0.016s
sys 0m0.004s
$ time tac foo > /dev/null 2>&1
real 0m0.003s
user 0m0.004s
sys 0m0.000s
...그러므로 가 있으면 tac
사용하고, 그렇지 않으면 perl
또는 을 사용하세요 awk
.
답변3
이것tac
유틸리티는 라인을 반전시킵니다. cat
그 반대 입니다 .
답변4
GNU 유틸리티(Linux, Cygwin) 및 BusyBox에는 tac
텍스트 파일의 줄 순서를 바꾸는 명령이 있습니다.
그렇지 않은 시스템에서는 tac
표준 명령을 통해 작동할 수 있습니다.크리스 탕의 답변파일 전체를 메모리에 저장하여 이를 달성하는 여러 가지 방법을 보여줍니다. 매우 큰 파일의 경우 영향 없이 대부분의 unice에서 작동하는 방법은 sort
반전하는 것입니다. 이는 적당한 크기의 파일에는 효율적이지 않지만 정렬 구현은 사용 가능한 메모리보다 큰 파일을 처리할 수 있는 경우가 많습니다.
nl | sort -nr | sed 's/.*\t//'
( \t
리터럴 탭으로 대체합니다.)
이미Michael Mrozek은 다음과 같이 언급했습니다., 줄을 바꾸는 것은 파일에 데이터를 추가하는 끔찍한 방법입니다. 이 방법은 이해하기 어렵고 추가 작업이 많이 필요합니다.