"test.txt"라는 텍스트 파일 앞에 "hello world"라는 문자열을 삽입하려고 합니다. 이 작업을 수행하기 위해 sed를 사용했지만 불행하게도 "sed 명령"이 전체 파일을 읽을 때 메모리를 죽였습니다.
내 파일에는 1GB의 텍스트가 포함되어 있고 메모리는 512MB밖에 없습니다. 어떻게 해야 합니까? ,이와 같이:
echo --insert-before "hello world" >> test.txt
아니면 다음과 같이 삽입하려면 어떤 연산자를 사용해야 합니까?
echo "hello world" << test.txt
아니면 다른 아이디어인가요?
참고: 끝에 텍스트를 삽입하는 연산자는 >>
잘 작동합니다. 메모리가 소모되지는 않지만 새 줄 없이 텍스트 파일의 내용을 덮어쓰지 않고 파일 시작 부분에서 역순으로 수행해야 합니다.
제가 사용하는 실제 코드는 다음과 같습니다.
echo "hello world" > test.txt;
echo "the large content that size is 1gb" >> test.txt;
sed -i ':a;N;$!ba;s/\n//g' test.txt;
답변1
사용하는 명령의 순서는 다음과 같습니다.
echo "hello world" > test.txt;
echo "the large content that size is 1gb" >> test.txt;
sed -i ':a;N;$!ba;s/\n//g' test.txt;
나는 이 명령이 실제로 다음과 같다고 가정합니다.
echo "hello world" > newfile;
cat test.txt >> newfile; # assuming the file with 1GigaByte was test.txt
설명에서 줄 바꿈을 제거하는 데만 사용되는 sed 명령에 대해 불평합니다.
tr
(너무 많은) 메모리를 사용하지 않고도 동일한 작업을 수행할 수 있습니다.
echo "hello world" > newfile;
cat test.txt | tr -d '\n' >> newfile
newfile
"hello world"가 앞에 붙은 test.txt 사본이 있을 것입니다 .
답변2
sed
메모리를 너무 많이 사용하지 않습니다. 그러나 운영 체제가 디스크를 캐싱하고 있을 수 있습니다. 따라서 를 사용하면 nocache
도움이 될 수 있습니다(디스크가 충분히 빠르거나 동일한 데이터를 여러 번 읽지 않는 경우). 및/또는 --unbuffered
옵션을 사용합니다 sed
( sed
종속성이 가능한 한 적은 메모리를 사용하도록).
또한 에코 옵션이 있을 수 없습니다. 이는 >>
명령이 아닌 쉘에 의해 수행됩니다. 이는 명령의 표준 출력을 파일에 추가하도록 쉘에 지시합니다.
@Kusalananda가 말했듯이 sed
스크립트는 효율적이지 않습니다. 아마 고양이만 사용할 것 같아요.
uncache cat "<(echo the_prefix)" old_file_name > new_file_name
rm old_file_name
mv -T new_file_name old_file_name #note not all `mv`s have the `-T` option, it can unsafely be left out.
답변3
좀 더 간단한 건 어때요?
cat <<_eof_ > file
Hello world!
$(cat file)
_eof_
아니면 에드를 사용하세요
echo '0a
your text here
.
w' | ed some_file
답변4
이것이 당신의 기억을 죽이고 있다면:
sed -i ':a;N;$!ba;s/\n//g' "test.txt"
그런 다음 개행 문자를 제거하고 한 번에 하나씩만 읽으려면 다음을 시도하십시오.
{
printf "hello world" # with no newline
while IFS= read -r line || [ -n "$line" ]; do
printf "%s" "$line"
done < test.txt
echo "" # add a newline to the end of the file
} > test.txt.tmp && mv test.txt{.tmp,}
일반적인 상황에서는 sed보다 약간 느리지만 상황이 특이합니다.