J'ai un fichier xml de 150 Go que je voudrais raccourcir (c'est-à-dire tronquer) à environ 1 Go - y a-t-il une commande simple (bash ou similaire) que je peux utiliser, ou dois-je suivre la route programmatique (le modifier dans vi ou emacs est un cauchemar même sur les gros systèmes de fer)?
(Je ne suis pas particulièrement préoccupé par la perte d'informations, je veux un fichier plus court afin que je puisse tester un logiciel à ce sujet et ne pas attendre plusieurs heures pour la réponse, un fichier plus court me permettra de le faire.)
bash
unix
file-management
adrianmcmenamin
la source
la source
Réponses:
En supposant que vous souhaitiez tronquer et extraire le premier 1 Go du fichier de 150 Go:
Avec
head
:head -c 1G infile > outfile
Notez que le
G
suffixe peut être remplacé parGB
pour s'aligner sur 1000 au lieu de 1024.Ou avec
dd
:dd if=infile of=outfile bs=1M count=1024
Ou comme dans Wumpus Q. La réponse de Wumbley,
dd
peut tronquer en place.la source
Pour tronquer un fichier à 1 gigaoctet, utilisez la
truncate
commande:Le résultat de la troncature ne sera probablement pas un fichier XML valide, mais je suppose que vous comprenez cela.
La documentation pour la version GNU
truncate
est ici et la documentation pour la version BSD est icila source
Dans la mesure du possible, j'utiliserais la
truncate
commande comme dans la réponse de John1024. Ce n'est pas une commande Unix standard, donc vous pourriez un jour vous retrouver incapable de l'utiliser. Dans ce cas,dd
peut également effectuer une troncature sur place.dd
Le comportement par défaut est de tronquer le fichier de sortie au point où la copie se termine, il vous suffit donc de lui donner un fichier d'entrée de longueur 0 et de lui dire de commencer à écrire au point de troncature souhaité:(Ce n'est pas la même chose que la copie et la troncature
dd
dans la réponse de multithr3at3d.)Notez que j'ai utilisé 1048576 et 1024 car 1048576 * 1024 est la taille souhaitée. J'évitais bs = 1m parce que c'est une réponse « portabilité », et classique
dd
ne connaît que suffixesk
,b
etw
.la source
bs
nombre multiplié par leseek
nombre est le nombre d'octets à conserver. Deux nombres qui satisfont à cette contrainte devraient fonctionner; par exemple,bs=1073741824 seek=1
oubs=1 seek=1073741824
. Ou, comme la valeur parbs
défaut est 512,seek=2097152
seul devrait également fonctionner. Et vous pouvez utiliser la notation comme1M
,1K
,1G
et2M
.Je ne suis pas tout à fait sûr de ce que vous demandez. Voulez-vous simplement vous débarrasser des 149 Go restants ou essayez-vous de compresser 150 Go en 1 Go? Quoi qu'il en soit, cela peut être une méthode utile pour y parvenir.
La
split
commande peut diviser n'importe quel fichier en plusieurs morceaux. Voir l' homme fendu . Vous pouvez spécifier la taille des morceaux de fichier que vous souhaitez diviser en avec l'-b
option. Par exemple:$ split -b 1 Go monfichier.xml
Sans aucune autre option, cela devrait créer plusieurs fichiers dans le répertoire courant en commençant par la lettre
x
. Si vous souhaitez ajuster les noms des fichiers divisés, reportez-vous à la page de manuel.Pour réassembler le fichier, utilisez simplement
cat * > re-assembled.xml
.Exemple:
la source
Vous pouvez utiliser la
split
commande.Pour plus de détails, jetez un œil à cette réponse stackoverflow
la source
Au final, je viens
sed
d'extraire un nombre arbitraire de lignes:la source
sed 1000000q
(et un peu plus compact, visuellement parlant).