터미널에서 두 번째 열을 기준으로 파일을 정렬하는 방법 파일 내용은 다음과 같습니다.
Nome Note
------------
Mehdi 0
Sunday 20
Others 10
Shnou 5
사용해 sort -t' ' -nk2
도 올바른 결과가 나오지 않습니다. 또한 파일 내용이 정렬된 상태로 유지되도록 하려면 어떻게 해야 합니까?
답변1
내 생각에 당신이 원하는 것은 이것이다:
방법 #1: 머리와 꼬리 사용
$ (head -n 2 sample.txt; tail -n +3 sample.txt | sort -t' ' -nk2) > a.tmp && mv a.tmp sample.txt
Nome Note
------------
Mehdi 0
Shnou 5
Others 10
Sunday 20
이렇게 하면 텍스트 파일의 첫 번째 줄을 가져온 다음 처음 두 줄 이후의 모든 항목을 가져온 다음 정렬합니다.
방법 #2: 헤더만 사용
$ (head -n 2; sort -t' ' -nk2) < sample.txt > a.tmp && mv a.tmp sample.txt
Nome Note
------------
Mehdi 0
Shnou 5
Others 10
Sunday 20
텍스트 파일을 입력으로 사용하여 첫 번째 줄만 표시하고 나머지 줄을 정렬합니다.
파일을 제자리에서 편집하는 것은 일반적으로 좋은 생각이 아닙니다. 가능하지만 중간 파일을 사용하는 것이 더 좋습니다.
방법 #3: 중간 파일 없이 #2 실행
@StephaneChazelas의 아이디어를 빌려 "1<>" 표기법을 사용하여 파일을 읽고 쓰기 위해 열 수 있으며, 그가 sort
제안한 해당 명령 개선 사항은 다음과 같습니다.
$ (head -n 2; sort -nk2) < sample.txt 1<> sample.txt
Nome Note
------------
Mehdi 0
Shnou 5
Others 10
Sunday 20
답변2
현재 위치에 있는 파일을 덮어쓰려면 다음을 수행할 수 있습니다.
{
head -n 2 &&
sort -k2n
} < the-file.txt 1<> the-file.txt
sort
이는 출력 쓰기를 시작하기 전에 입력을 완전히 읽어서 읽고 있는 파일에 쓸 수 있기 때문에 작동합니다 . 그리고 출력은 입력과 크기가 동일하므로 결국 파일을 자를 필요가 없습니다.
기본 구분 기호 대신 사용하면 -t' '
입력의 각 공백 문자가 새 필드를 생성합니다. 예를 들면 다음과 같습니다.
a 10
b 2
(앞에 1칸 a
, 뒤에 2칸이 있습니다 b
), -t' ' -nk2
(기억하세요 -k2
.필드 2부터 라인 끝까지-k2,2
, 그리고 동시에필드 2만) 만 숫자 "a 10"
와 " 2"
비교되는 반면 -nk2
단독 으로 숫자 " 10"
와 " 2"
비교됩니다 (숫자 비교에서는 선행 공백이 무시됩니다).
답변3
파일의 두 부분을 정렬해야 합니다. 다른 답변에서 크게 영감을 얻은 확장 답변은 다음과 같습니다.
파일.txt
Nome Note
------------
Mehdi 0
Sunday 20
Others 10
Shnou 5
Example
------------
Foo
bar
Baz
Results: Finished!
여러 섹션을 연결하고 정렬할 수도 있고 연결하지 않고 다른 옵션을 통해 정렬할 수도 있습니다. 마지막 단계로 cat
정렬되지 않은 청크가 모두 출력됩니다.
(head -n 2; head -n 4 | sort -nk2 ; head -n 3; head -n 3 | sort; cat ) < file.txt 1<> sorted.txt
정렬.txt
Nome Note
------------
Mehdi 0
Shnou 5
Others 10
Sunday 20
Example
------------
bar
Baz
Foo
Results: Finished!