Bagaimana saya bisa mempersingkat file dari baris perintah?


9

Saya memiliki file 150ml xml yang ingin saya persingkat (yaitu terpotong) menjadi sekitar 1GB - apakah ada perintah (bash atau serupa) yang sederhana yang dapat saya gunakan, atau apakah saya harus pergi dengan rute program (mengeditnya di vi atau emacs adalah mimpi buruk bahkan pada sistem besi besar)?

(Saya tidak terlalu peduli dengan hilangnya informasi, saya ingin file yang lebih pendek sehingga saya bisa menguji perangkat lunak ini dan tidak menunggu berjam-jam untuk jawabannya, file yang lebih pendek akan memungkinkan saya melakukan itu.)


1
Apakah Anda bermaksud memotong file, atau ingin menghapus informasi dari seluruh file?
AFH

1
CAB

2
Karena ini adalah file XML, yang saya asumsikan berisi urutan dengan sejumlah besar elemen, Anda juga bisa menggunakan bahasa transformasi XML seperti XQuery untuk memfilter sejumlah elemen ini, yang akan memiliki keuntungan untuk menghasilkan XML yang valid ( Contoh )
Aaron

4
Apakah file tersebut masih harus valid XML saat selesai?
Joe

1
tidak, saya hanya menambalnya begitu saja
adrianmcmenamin

Jawaban:


15

Dengan asumsi Anda ingin memotong dan mengekstrak 1 GB pertama dari 150 GB file:

Dengan head:

head -c 1G infile > outfile

Perhatikan bahwa G akhiran bisa diganti dengan GB untuk menyelaraskan ke 1000, bukan 1024.

Atau dengan dd:

dd if=infile of=outfile bs=1M count=1024

Atau seperti dalam jawaban Wumpus Q. Wumbley, dd dapat terpotong di tempat.


5
Itu kemungkinan tidak akan menghasilkan file XML yang dapat dibaca setelah selesai.
Joe

3
@ Jo - OP tidak meminta file yang dapat dibaca (juga tidak mengatakan itu tidak dapat dibaca). Mereka mengatakan bahwa mereka tidak peduli dengan kehilangan informasi. Saya mengharapkan pertanyaan baru dari OP tentang cara memperbaiki file tersebut.
KevinDTimm

3
Saya cukup tahu xml untuk memperbaikinya, saya menulis DTD untuk format!
adrianmcmenamin

37

Untuk memotong file hingga 1 gigabyte, gunakan file truncate perintah:

truncate -s 1G file.xml

Hasil pemotongan kemungkinan bukan file XML yang valid tapi saya rasa Anda mengerti itu.

Dokumentasi untuk versi GNU dari truncate aku s sini dan dokumentasi untuk versi BSD adalah sini


14

Jika memungkinkan, saya akan menggunakan truncate perintah seperti pada jawaban John1024. Ini bukan perintah unix standar, jadi Anda mungkin suatu hari tidak dapat menggunakannya. Dalam hal itu, dd dapat melakukan pemotongan di tempat juga.

dd Perilaku default adalah memotong file output pada titik di mana penyalinan berakhir, jadi Anda cukup memberikan file input 0-panjang dan suruh untuk mulai menulis pada titik pemotongan yang diinginkan:

dd if=/dev/null of=filename bs=1048576 seek=1024

(Ini tidak sama dengan copy-dan-terpotong dd dalam jawaban multithr3at3d.)

Perhatikan bahwa saya menggunakan 1048576 dan 1024 karena 1048576 * 1024 adalah ukuran yang diinginkan. Saya menghindari bs = 1m karena ini adalah jawaban "mudah dibawa", dan klasik dd hanya tahu akhiran k, b, dan w.


2
Untuk solusi umum, Anda mungkin harus mencatat bahwa bs angka dikalikan dengan seek number adalah jumlah byte yang harus disimpan. Dua angka yang memenuhi batasan harus berfungsi; misalnya., bs=1073741824 seek=1 atau bs=1 seek=1073741824. Atau sejak itu bs default ke 512, seek=2097152 sendirian juga harus bekerja. Dan Anda dapat menggunakan notasi seperti 1M, 1K, 1G dan 2M.
G-Man

1

Saya tidak sepenuhnya yakin apa yang Anda minta. Apakah Anda hanya ingin menyingkirkan 149GB lainnya atau Anda mencoba mengompres 150GB menjadi 1 GB? Bagaimanapun, ini mungkin metode yang berguna untuk mencapai ini.

Itu split perintah dapat membagi file apa pun menjadi beberapa bagian. Lihat pria berpisah . Anda dapat menentukan ukuran potongan file yang ingin Anda bagi dengan -b pilihan. Contohnya:

$ split -b 1GB myfile.xml

Tanpa opsi lain, ini harus membuat beberapa file dalam direktori saat ini dimulai dengan huruf x. Jika Anda ingin menyesuaikan nama file yang dibagi, lihat halaman manual.

Untuk merakit kembali file cukup gunakan cat * > re-assembled.xml.

Contoh:

[kent_x86.py@c7 split-test]$ ls -l opendocman*
-rw-rw-r--.  1 kent_x86.py kent_x86.py 2082602 Mar 31  2017 opendocman-1.3.5.tar.gz

[kent_x86.py@c7 split-test]$ split -b 100K opendocman-1.3.5.tar.gz 
[kent_x86.py@c7 split-test]$ ls
opendocman-1.3.5.tar.gz  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat  xau
[kent_x86.py@c7 split-test]$ ll
total 4072
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:06 opendocman-1.3.5.tar.gz
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaa
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xab
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xac
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xad
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xae
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaf
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xag
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xah
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xai
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaj
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xak
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xal
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xam
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xan
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xao
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xap
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaq
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xar
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xas
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xat
-rw-rw-r--. 1 kent_x86.py kent_x86.py   34602 Jan  5 11:06 xau
[kent_x86.py@c7 split-test]$ cat xa* > opendoc-reassembled.tar.gz
[kent_x86.py@c7 split-test]$ ls -l opendoc-reassembled*
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:07 opendoc-reassembled.tar.gz


0

Pada akhirnya saya hanya menggunakan sed untuk mengekstrak sejumlah baris yang berubah-ubah:

sed -n 1,1000000p infile.xml>outfile.xml

1
Mengesampingkan apakah ini menjawab pertanyaan atau tidak, ini akan memindai seluruh file, saya percaya, jadi jauh lebih efisien untuk digunakan sed 1000000q (dan sedikit lebih kompak, secara visual).
B Layer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.