파일의 일부 정렬

파일의 일부 정렬

터미널에서 두 번째 열을 기준으로 파일을 정렬하는 방법 파일 내용은 다음과 같습니다.

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!

관련 정보