2017-12-01 2 views
0

큰 데이터 (수백만 줄)로 작업하고 있습니다.gzip 파일에 줄 단위로 쓰기

나는이 줄을 생성하는 COTS 스크립트를 가지고 있으며 내용별로 다른 파일에 줄을 주석 처리해야합니다. 순수 텍스트로 된 파일의 크기 때문에 gzip 형식으로 직접 데이터를 쓸 수 있다면 이상적입니다.

e.e. 때문에 파일 크기와 라인 카운트 극한의 다시

line_generator | while read line; do 
    [[ $line =~ .*0/0.* ]] && { echo "${#line}," | gzip -9 >> REF.out.gz ; } 
    [[ $line =~ .*0/1.* ]] && { echo "${line}" | gzip -9 >> MAT.out.gz ; } 
    [[ $line =~ .*1/0.* ]] && { echo "${line} | sed 's/X/y/g'" | gzip -9 >> MAT.out.gz ; } 
done 

는, 나는 내가 GZIP'ped 파일에 덤프 아웃하기 전에 먼저 메모리에있는 파일을 구축 할 수 있습니다 모르겠어요.

+0

즉석 압축 파일 시스템을 사용하십시오. gzip 압축을 사용하는 btrfs. –

답변

1

각 라인에 대해 gzip 사본을 별도로 발송합니다. 모든 라인이 독립적 인 블록으로 압축되기 때문에 속도가 느리고 압축에 어려움이 있으므로 아주 좋은 아이디어는 아닙니다. 줄이 짧으면 결과는 압축되지 않은 버전보다 길어집니다 ...

execprocess substitution을 사용하여 파이프를 한 번 열어서 루프 중에 계속 기록 할 수 있습니다 (exec는 셸을 대체합니다) 명령이 없으면 쉘 프로세스에서 redirections이 발생합니다. 예 :

#!/bin/bash 
exec 3> >(gzip -9 >> odd.out.gz) 
exec 4> >(gzip -9 >> even.out.gz) 

seq 1 1000 | while read x ; do 
     [[ $x =~ [13579]$ ]] && echo "$x" >&3 
     [[ $x =~ [02468]$ ]] && echo "$x" >&4 
done 
# close the pipes when you're done 
exec 3>&- 
exec 4>&- 
+0

멋지다! 고마워! – RightmireM

관련 문제