현재 A.gz
첫 번째 행의 헤더를 포함하여 많은 표 형식 데이터가 포함된 압축 파일이 있습니다. B.gz
이전 파일과 데이터는 동일하지만 헤더가 다른 다른 파일을 만들고 싶습니다 .
이를 수행하는 쉬운 방법은 첫 번째 줄을 제외한 모든 항목의 압축을 풀고 A.gz
-ing tail
한 다음 모든 항목을 다시 압축하는 것입니다. 그러나 이는 매우 비효율적인 것으로 보입니다. 특히 두 개의 -ed 파일을 연결하면 gzip
압축이 풀린 버전의 연결로 올바르게 압축이 풀리기 때문입니다.
다음과 같은 방법이 있는지 궁금합니다.
zcat A.gz | head -n 1 | process_header | gzip > B.gz
cat A.gz | (remove compressed header) >> B.gz
모든 내용의 압축을 풀 필요가 없습니다 A.gz
.
답변1
맨 위에 다른 행을 삽입하고 싶다면 쉽습니다.
echo some line | gzip > newfile.gz
cat newfile.gz oldfile.gz > result.gz
gzip은 연결을 허용합니다. 압축을 풀지 않고 파일을 보기만 하면 잘못된 압축되지 않은 파일 크기가 보고되는 것이 마음에 들지 않는다면, 즉, 그렇습니다. 또한 일부 프로그램에서는 WinRAR과 같은 파일을 처리할 수 없습니다.
실제로 원하는 것에 더 가까워지기 위한 질문은 gzip 파일이 서로 완전히 독립적으로 실행되는 청크로 구성되어 있는지 여부와 그렇다면 청크 경계를 찾는 방법입니다.
이 작업을 수행하고 두 개의 개별 gzip 파일을 연결하여 gzip을 생성하려는 경우 쉽게 해결할 수 있지만 임의의 gzip 파일을 사용하여 이를 수행하려면 gzip 파일 형식에 대한 더 깊은 이해가 필요합니다.
이전의 모든 것을 압축 해제하지 않고 특정 오프셋에 직접 액세스할 수 있는 bzip2 블록 맵을 생성한 bzip2 프로그램(이름은 잊어버렸습니다)이 있었던 것으로 기억합니다.
하지만 결국 대부분의 사람들은 다시 압축을 하게 됩니다. 어쨌든 전체 파일을 다시 작성하는 것을 피할 수는 없으며 파일 작성은 일반적으로 gzip으로 데이터를 압축하는 것보다 느립니다. 따라서 성공하면 일부 CPU 사이클을 절약할 수 있지만 시간은 없습니다.
문제에 대한 해결책은 아니지만 ... 첫 번째 행을 삭제하는 gzip
데 사용하지 마십시오 . 아마도 a 또는 다른 것에 비해 매우 비효율적일 것입니다. 첫 번째 줄을 삭제하기 위해 파일의 모든 줄을 셀 필요는 없습니다.tail
sed 1d
답변2
어때요?
zcat A.gz | awk '{if(NR==1){print "myheader"}else{print $0}}' | gzip > B.gz
NR(레코드 번호)이 1이면 자신만의 헤더를 출력합니다. 다른 모든 줄은 그대로 둡니다.
답변3
!!!이건 그냥 생각일 뿐이에요!
당신은 실행을 시도할 수 있습니다
zcat file | head -n100 > tempfile
vim tempfile # edit the file header
cat tempfile | gzip | dd of=B.gz conv=notrunc
이렇게 하면 압축된 파일에서 처음 100줄만 추출한 다음 이를 다시 압축하고 B.gz
파일 e의 동일한 블록을 세밀하게 덮어씁니다.
문제는 이것이 확인해야 할 실제 솔루션이 아니라는 것입니다.앞으로그리고뒤쪽에데이터는 동일한 바이트 수를 소비한 다음 파일을 반복하고 CRC32
새 파일을 계산하여 파일 바닥글에 씁니다.
당신이 대답하는 것이 더 나을 수도 있습니다.스티브당신을 위한.
답변4
여전히 압축을 풀지만 대용량 파일의 경우 zcat이나 gzip보다 훨씬 빠릅니다.
pigz -dc new_header.txt.gz A.gz | sed '2d' | pigz > B.gz
위 명령을 실행하기 전에 새 헤더 new_header.txt
(개행 없이)를 넣고 gzip으로 압축 하면 됩니다.