Làm thế nào để nối một dòng trong một tệp nén mà không giải nén?


8
mknod /tmp/oracle.pipe p

sqlplus / as sysdba << _EOF
set escape on

host nohup gzip -c < /tmp/oracle.pipe > /tmp/out1.gz \&
spool /tmp/oracle.pipe
select * from employee;
spool off

_EOF

rm /tmp/oracle.pip

Tôi cần chèn một đoạn giới thiệu ở cuối tệp được nén ra1.gz, tôi có thể đếm các dòng bằng cách sử dụng

count=zcat out1.gz |wc -l

Làm thế nào để tôi chèn trailer

T5 (assuming count=5)

Vào cuối out1.gz mà không giải nén nó.


Tôi có hiểu đúng về bạn không: bạn muốn thêm một dòng văn bản vào một tệp nén?
Fiximan

Có mà không giải nén tập tin
Rishi Deorukhkar

1
i) count=zcat out1.gz |wc -lsẽ không làm việc, bạn cần một cái gì đó như count=$(zcat out1.gz |wc -l); ii) zcat đang giải nén tệp, nếu bạn sẵn sàng làm điều đó, tại sao bạn không muốn giải nén? iii) Tại sao bạn không đếm các dòng và thêm số trước khi nén tệp ở vị trí đầu tiên?
terdon

BTW, "để chèn vào cuối" được gọi là "để chắp thêm", đó chính xác là những gì câu trả lời được chấp nhận làm. Có lẽ bạn nên chỉnh sửa tiêu đề.
Dmitry Grigoryev

Câu trả lời:


18

Từ man gzipbạn có thể đọc rằng gzipcác tập tin ped có thể được nối đơn giản:

SỬ DỤNG NÂNG CAO Nhiều tập tin nén có thể được nối. Trong trường hợp này, gunzip sẽ trích xuất tất cả các thành viên cùng một lúc. Ví dụ:

        gzip -c file1  > foo.gz
        gzip -c file2 >> foo.gz

  Then

        gunzip -c foo

  is equivalent to

         cat file1 file2

Điều này cũng có thể được thực hiện bằng cách sử dụng catcho các gziptệp ped, ví dụ:

seq 1 4 > A && gzip A
echo 5 > B && gzip B
#now 1 to 4 is in A.gz and 5 in B.gz, we want 1 to 5 in C.gz:
cat A.gz B.gz > C.gz && zcat C.gz
1
2
3
4
5
#or for appending B.gz to A.gz:
cat B.gz >> A.gz

Để làm điều đó mà không có tệp bên ngoài để dòng của bạn được nối thêm, hãy làm như sau:

echo "this is the new line" | gzip - | cat - >> original_file.gz

Điều này có thể làm việc cho ví dụ đơn giản của bạn, vì hầu như không có gì để nén. Bây giờ hãy thử với các dòng phức tạp hơn có chứa các lớp nền chồng chéo.
Murphy

Dường như hoạt động với việc thêm tập tin toa cvs "Xin chào" của tôi đã được nén từ kích thước 400kB đến 100kB. Nhưng tôi không biết làm thế nào nén trong gziphoạt động và nếu có thể làm hỏng bất cứ điều gì. Cho đến nay một vài tập tin văn bản tôi đã thử đều ổn.
Fiximan

Có vẻ như điều này thực sự sẽ làm việc; điểm mù đã đứng về phía tôi: stackoverflow.com/questions/8005114/ Kẻ
Murphy

@Murphy cảm ơn bạn đã làm rõ - Tôi đã sử dụng điều này trước đây và bạn đã khiến tôi lo lắng về dữ liệu trước đây của mình
Fiximan

Nó không rõ ràng từ văn bản của bạn nếu bạn vừa thực hiện giải pháp đó. Tôi xin lỗi vì đã tải xuống và muốn hoàn nguyên nó, nhưng tiếc là phiếu bầu hiện bị khóa cho đến khi bạn chỉnh sửa câu trả lời - một đặc điểm riêng khác cho U & L?
Murphy

2

Bàn nhân viên của bạn lớn cỡ nào? Trừ khi bạn có một triệu nhân viên và mỗi bản ghi cần hàng nghìn byte, thì có lẽ không đáng để bận tâm đến việc nén đầu ra.

Hầu như chắc chắn không đáng để bận tâm đến việc nén nó khi tệp đầu ra đang được tạo - vậy tại sao không chỉ xuất ra văn bản đơn giản không nén, chạy count=$(wc -l out1) ; echo "T$count" >> out1, sau đó nén nó với gzip out1?

cách khác, chỉ cần chạy một số biến thể của select count(*) from employeetrước spool offlệnh.


Bảng có 2 triệu bản ghi và trích xuất không nén là khoảng 2 GB nhưng bị giới hạn dung lượng do đó cần phải nén nó khi đang di chuyển
Rishi Deorukhkar

1

Tôi đã vật lộn với một thử thách tương tự: nối thêm một vài dòng vào một bãi rác sql nén. Giải pháp của tôi dựa trên câu trả lời từ @Fiximan

echo 'append this string' | gzip >> out.gz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.