sort는`sed --in-place`와 같이 제자리에서 파일 정렬을 지원합니까?


80

나는 장님 입니까 또는 같은 옵션 --in-placesort없습니까?

입력 파일에 결과를 저장하기 위해 sed는 -i( --in-place)를 사용합니다 .

출력을 sort입력 파일로 경로 재 지정

sort < f > f

비워집니다. --in-place옵션 이없는 경우 - 편리한 방법 으로이 작업을 수행하는 방법이 있습니까?

(내 마음에 온 유일한 것은 :

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

이동이 올바른 선택이 아니기 때문에 파일 권한 이 변경 될 수 있습니다. 그렇기 때문에 임시 파일의 내용으로 덮어 쓴 다음 제거합니다.)


또한 insitu모든 명령을 제자리에서 사용할 수 있습니다.
sr_

@sr_, 그것은 흥미로운 명령이지만, 어떤 명령 에서도 작동하지 않으며 , 읽은 것보다 빠르지 않은 명령 만 작동 합니다 (그렇지 않으면 명령이 읽기 전에 입력 파일을 방해합니다). 작동한다는 보장은 없습니다 sort.
CJM

@ cjm, 나는 확실하지 않지만, 경우를 처리해야합니까?
sr_

@ sr_, 당신이 옳은 것 같아요. 소스를 보지 않고 설명을 읽었습니다. 실제로 큰 파일의 경우 버퍼 및 충돌에 대한 메모리가 부족할 수 있습니다 (malloc에서 NULL 반환을 확인하는 것처럼 보이지 않습니다).
CJM

@cjm : 아 맞아.
sr_

답변:


110

sort-o, --output파일 이름을 인수로 사용 하는 옵션이 있습니다. 입력 파일과 동일하면 결과를 임시 파일에 기록한 다음 원래 입력 파일을 덮어 씁니다 (정확히 수행하는 것과 동일 함 sed -i).

에서 GNU sort정보 페이지 :

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

그리고 Open Group Base Specification Issue 7 :

-o  output
    Specify the name of an output file to be used instead of the standard 
    output. This file can be the same as one of the input files.

바로 그거죠 ! 효과가있다 ! 나는 그것에 대한 단서를 볼 수 없습니다 man sort-그것은 문서화되지 않은 기능입니까? 표준적이고 휴대용입니까?
Grzegorz Wierzowiecki

@GrzegorzWierzowiecki : 업데이트 참조.
enzotib

좋은 답변 :).
Grzegorz Wierzowiecki

1
요약 sort -o <filename> <filename>하면 파일을 안전하게 정렬합니다.
phyatt

11

sponge함수 를 사용할 수 있습니다.이 함수는 먼저 stdin다음을 담그고 파일에 씁니다.

sort < f | sponge f

단점은 sponge출력을 메모리에 임시로 저장하므로 큰 파일에는 문제가 될 수 있다는 것입니다. 그렇지 않으면 먼저 파일에 파일을 쓴 다음 원본 파일을 덮어 써야합니다.

그러나 다른 답변에서 지적했듯이 프로세스 중간 (예 : 프로세스 sponge) 중에 시스템이 중단되어 원본 파일과 새 파일을 모두 잃을 수 있기 때문에 수정은 일반적으로 좋은 생각이 아닙니다 . 먼저 다른 파일에 작성한 다음 원자 mv(이동) 명령 을 사용하는 것이 좋습니다 .


7

입력 파일을 출력 파일로 덮어 쓰는 것은 위험합니다. 파일을 쓰는 동안 프로그램이나 시스템이 충돌하면 둘 다 손실 되었기 때문입니다.

일부 프로그램 (대부분 GNU 버전)에는 적절한 옵션이 있습니다 (예 : -iperl 및 GNU sed; -oGNU 정렬). 데이터를 임시 파일에 넣은 다음 제자리로 이동하여 작동합니다. 그러한 옵션이없는 프로그램의 경우, Colin Watson sponge유틸리티 ( Joy Hess의 moreutils에 포함 )는 모든 프로그램에 대해 안전하게 작업을 수행합니다 (예 : 파일을 제자리에서 변경할 수 있습니까 cut? ; iconv를 입력 파일을 변환 된 파일로 바꾸려면 어떻게 해야합니까? 출력? ).

동일한 권한으로 원본 파일을 다시 만들 수없는 드문 경우에만 파일을 덮어 쓰는 것이 좋습니다. 이 경우 원래 입력을 어딘가에 저장하는 것이 좋습니다. 그런 다음 간단히 입력 사본을 처리하여 원본 파일로 보낼 수 있습니다.

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional

1
sort -oGNU 전용이 아니며 특히 파일을 적절하게 수정하도록 설계되었습니다. sort메모리 또는 임시 파일을 사용하여 데이터를 저장하기 전에 입력을 완전히 읽기 전에 출력 쓰기를 시작할 수 없으므로 입력을 무시할 수 있어야합니다.
Stéphane Chazelas

실제로 GNU sort는 POSIX sort -mo file1 file1 file2가 아니기 때문에 작동하지 않을 수도 있지만 전통적인 sort사람들은이 문제를 해결하는 방법을 알고 있습니다 (70 년대의 Unix V7에서는 이미).
Stéphane Chazelas

@JoelCross Odd sort -o는 coreutils 8.25에서 나를 위해 작동하며 속성은 설명서에 설명되어 있습니다 (병합 할 때가 아니라 정렬 할 때에 만 해당됨 ). 이를 재현 할 수있는 경우 정확한 명령 행, 정확한 입력 파일, 실행중인 시스템 및 바이너리를 구한 방법을 나타내는 버그 보고서를 보내십시오.
Gilles

4

-ovim-way를 사용 하거나 시도하십시오 :

$ ex -s +'%!sort' -cxa file.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.