다음과 같은 sorted.txt라는 정렬된 파일이 있다고 가정해 보겠습니다.
beautiful
easy
fast
functional
handy
이제 이렇게 하면 echo fine-grained >> sorted.txt
파일 끝에 "handy" 뒤에 "fine-grained"가 추가됩니다. 파일 순서를 바꾸지 않고 "Quick"과 "Functional" 사이에 순서대로 삽입할 수 있는 방법이 있나요?
답변1
이론적으로는 가능하지만 마법 같은 방법은 없습니다.
어떤 값을 넣으려는지 정확히 알고 있다면 sed
내부 검색 및 바꾸기를 사용하여 새 값을 파일에 붙여넣을 수 있지만 정렬의 복잡성을 고려하면 기본적으로 어딘가에서 정렬해야 하는지에 따라 다릅니다. 대기열에 있습니다.
echo fine-grained >> sorted.txt
sort sorted.txt > sorted.txt.new && mv sorted.txt{.new,}
또는sponge
:
{ echo fine-grained ; cat sorted.txt } | sort | sponge sorted.txt
편집하다: 자일스-m
작업 속도를 높이기 위해 정렬 매개변수를 사용하는 방법에 대한 좋은 제안이 있었습니다 . 매뉴얼에서:
-m, --merge merge already sorted files; do not sort
이렇게 하면 정렬이 전체 입력을 처리하는 것을 방지할 수 있으며 입력 파일을 스캔하고 파일 간의 관계를 파악하기만 하면 됩니다.
echo fine-grained | sort -m sorted.txt - | sponge sorted.txt
답변2
파일에 데이터를 삽입할 수 없습니다. POSIX API에는 이에 대한 규정이 없습니다. 최선의 방법은 이동되지 않은 모든 데이터를 찾아 새 행을 작성한 후 다음 데이터를 모두 아래로 이동하는 것입니다. 이는 자신만의 프로그램을 작성하지 않고서는 달성하기 까다롭고 쉽지 않습니다.
새 파일을 생성하고 싶다면 awk를 사용하여 이 작업을 매우 쉽게 수행할 수 있습니다.
awk -v newline=fine-grained '
!inserted && $0 > newline { print newline; inserted=1 }
1
'
스크립트의 첫 번째 줄은 스크립트가 아직 삽입하지 않았고 입력 줄이 삽입하려는 줄 뒤에 있는 경우에만 삽입하려는 줄을 인쇄합니다. 또한 행이 삽입되었음을 기록합니다.
두 번째 줄은 입력 줄을 인쇄합니다(표현식 1
은 true이고 기본 동작은 입력 줄을 인쇄하는 것이므로 그렇게 말할 필요가 없습니다 { print }
.
답변3
귀하의 질문에 대한 직접적인 대답은 '아니오'입니다. 어딘가에서 일종의 종류를 실행해야 합니다.
답변4
어떻게든 처리해야 합니다. 시간 문제일 뿐입니다. 하지만 당신이 찾고 있는 것은 일회성 거래인 것 같아요. 방법은 귀하에게 달려 있으며 더 빠른 방법이 여러 가지 있습니다.
이렇게 하면 작업이 완료되지만 자유롭게 다른 방법을 시도해 보세요.
echo "$(echo fine-grained | cat - sorted.txt | sort)" > sorted.txt
파일을 읽기 전에 잘리는 것을 방지하기 위해 내부 서브셸에서 시작하여 에코된 입력을 디스크 파일과 연결합니다. 참조하는 내용을 에코하면 줄 바꿈이 유지됩니다. 그런 다음 정렬하십시오.
sort -m
또는 Giles가 제안한 대로 압축하고 UUOC를 피하세요.
echo "$(echo fine-grained | sort -m - sorted.txt)" > sorted.txt