Как я могу сравнить два файла формата zip (.tar, .gz, .Z) в Unix - PullRequest
0 голосов
/ 05 июля 2010

У меня есть два файла gz.Я хочу сравнить эти файлы без распаковки.например:

первый файл - это number.txt.gz - внутри этого файла:

1111,589,3698, 
2222,598,4589, 
3333,478,2695, 
4444,258,3694, 

второй файл - xxx.txt.gz:

1111,589,3698, 
2222,598,4589, 

Iхочу сравнить любой столбец между этими файлами.Если column1 в первом файле равен 1-му столбцу второго файла, значит, я хочу вывод, подобный этому:

1111,589,3698, 
2222,598,4589,

Ответы [ 5 ]

2 голосов
/ 05 июля 2010

Если вам нужно проверить и сравнить ваши данные после их записи в эти огромные файлы, и у вас есть ограничения по времени и пространству, мешающие вам сделать это, то вы используете неправильный формат хранения. Если ваш формат хранения данных не поддерживает ваш процесс, то это то, что вам нужно изменить.

Мое предложение было бы выбросить ваши данные в базу данных, а не записывать их в сжатые файлы. С разумными ключами сравнение подмножеств этих данных может быть выполнено простым запросом, и удаление ненужных данных становится таким же простым.

Транзакционность и строгое соответствие SQL, вероятно, здесь не являются приоритетами, поэтому я бы остановился на MySQL (с драйвером MyISAM) в качестве простой и быстрой БД.


РЕДАКТИРОВАТЬ: Альтернативно, предложение Blorgbeard вполне разумно и выполнимо. На любом языке программирования, который имеет доступ к (де) библиотекам сжатия, вы можете последовательно читать сжатый файл без записи расширенного текста на диск; и если вы сделаете это параллельно для двух входных файлов, вы сможете выполнить сравнение без проблем с пространством вообще.

Что касается проблемы времени, вы обнаружите, что чтение и распаковка файла (но не запись его на диск) намного быстрее, чем запись на диск. Недавно я написал аналогичную программу, которая принимает файл .ZIPped в качестве входных данных и создает файл .ZIPped в качестве выходных данных, не записывая несжатые данные в файл; и он работает намного быстрее, чем более ранняя версия, которая распаковывала, обрабатывала и перепаковывала данные.

2 голосов
/ 05 июля 2010

Вы не можете сделать это.

Вы можете сравнить весь контент из архива, сравнивая архивы, но не часть данных в сжатых файлах.

Вы также можете сравнивать выбранные файлы в архиве без распаковки, поскольку в архиве есть метаданные с контрольной суммой CRC32 , и вы должны сравнить эту сумму, чтобы узнать ее без распаковки.

1 голос
/ 05 июля 2010

Я не уверен на 100%, соответствует ли оно столбцам / полям или целым строкам, но в случае строк что-то в этих строках должно работать:

comm -12 <(zcat number.txt.gz) <(zcat xxx.txt.gz)

или, если оболочка этого не поддерживает, возможно:

zcat number.txt.gz | { zcat xxx.txt.gz | comm -12 /dev/fd/3 - ; } 3<&0
1 голос
/ 05 июля 2010

Вы не можете сравнивать файлы, пока они остаются сжатыми, используя разные методы.

Сначала необходимо распаковать файлы, а затем найти разницу между результатами.

Декомпрессию можно выполнить с помощью gunzip, tar и uncompress (или zcat).

Найти разницу можно с помощью команды diff.

0 голосов
/ 06 июля 2010

точный ответ, который я хочу, это только

nawk -F"," 'NR==FNR {a[$1];next} ($3 in a)' <(gzcat file1.txt.gz) <(gzcat file2.txt.gz)

. вместо awk nawk отлично работает и это gzip файл, поэтому используйте gzcat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...