Как сравнить несколько файлов без расширения в Bash - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в написании сценариев bash.Как я могу сравнить 8 выходов файлов без расширений (только с двоичными значениями) - одинаковой длины значений, 0 или 1. Чтобы прояснить ситуацию, это то, что я сделал до сих пор.

for d in */; do
find . -name base -execdir sh -c 'cat {} >> out' \;
done

Я нашел все файлы, которые находятся в подпапках, прочитал и объединил все двоичные файлы в файл out.

Теперь у меня есть 8 файлов out (8 родительских папок), которыеМне нужно сравнить с.

Я пробовал оба "diff" и "cmp" - но они оба работают только с 2 файлами.

В конце мне нужно проверить и проверить, есть ли разница между этими 8 двоичными файлами, и, в конечном итоге, экспортировать результаты и представить их в формате HEX - пример: если 2 из файлов out имеют значение «1» = Fи если все «0» = 0.следовательно, окончательные результаты должны быть, например, такими: FFFF 0000 (4 первых файла - все «1», 4 последних файла - «0»).

Каков наилучший вариант дляСделай так?- Надеюсь, что мне удалось уточнить мой случай.

Большое спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Позвольте мне предположить:

  • У нас есть 8 (предположительно двоичных) файлов, скажем: dir1/out.txt, dir2/out.txt, .. dir8/out.txt.
  • Мы хотимСравните среди этих файлов и определите, какие файлы идентичны, а какие нет.

Тогда как насчет шагов:

  1. Для генерации хеш-значений файлов, например, sha256sum.
  2. Чтобы сравнить значения хеш-функции и разделить на группы на основе значений хеш-функции.

Я создал 8 тестовых файлов, из которых dir1 / out.txt, dir2 / out.txt и dir4 / out.txt являются идентичными, dir3 / out.txt и dir7 / out.txt идентичны, а другие отличаются.

Тогда значения хеш-функции будут выглядеть следующим образом:

sha256sum dir*/out.txt

298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b  dir1/out.txt
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b  dir2/out.txt  
e962879ef251f2117460cf0d5ce714e36a9ab79f2548c48e2121b4e573cf179b  dir3/out.txt  
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b  dir4/out.txt
f45151f5253c62de69c95935f083b5649876fdb661412d4f32065a7b018bf68b  dir5/out.txt  
bdc26931acfb734b142a8d675f205becf27560dc461f501822de13274fe6fc8a  dir6/out.txt  
e962879ef251f2117460cf0d5ce714e36a9ab79f2548c48e2121b4e573cf179b  dir7/out.txt  
11a77c3d96c06974b53d7f40a577e6813739eb5c811b2a86f59038ea90add772  dir8/out.txt  

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

Вот сценарий:

sha256sum dir*/out.txt | awk '{if (!gid[$1]) gid[$1] = ++n; print $2 " " gid[$1]}'

Вывод:

dir1/out.txt 1
dir2/out.txt 1
dir3/out.txt 2
dir4/out.txt 1
dir5/out.txt 3
dir6/out.txt 4
dir7/out.txt 2
dir8/out.txt 5

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

Обратите внимание, что идентификатор группы не представляет содержимое каждого файла как: if 2 of the out.txt files are all '1' = F , and if all '0' = 0, потому что я понятия не имею, как выглядят файлы.Если OP может предоставить файлы примеров, я мог бы помочь.
Кстати, я все еще сомневаюсь, являются ли файлы двоичными в обычном смысле, потому что OP упоминает, что «это просто файл, который содержит0 или 1 в его значении, когда я его открываю ".Мне кажется, файлы состоят из «0» и «1».Мой скрипт выше должен работать как для двоичных, так и для текстовых файлов.

[Обновление]

Согласно информации ОП, вот решение для конкретного случая:

#!/bin/bash

for f in dir*/out.txt; do
    if [[ $(uniq "$f" | wc -l) = 1 ]]; then
        echo -n "$(head -1 "$f" | tr 1 F)" 
    else
        echo -n "-" 
    fi
done
echo

Он переваривает содержимое каждого файла на: 0 для всех 0, F для всех 1 или - для смешанного случая (возможная ошибка).
Например,, если dir {1..4} /out.txt - все 0, dir5 / out.txt - смесь, а dir {6..8} /out.txt - все 1, то результат будет выглядеть следующим образом:

0000-FFF

Надеюсь, он будет соответствовать требованиям ОП.

0 голосов
/ 06 марта 2019

Если вы ищете записи, которые являются уникальными в вашем списке файлов

cat $path/$files|uniq -u>/tmp/output.txt
grep -f /tmp/output.txt $path/$files
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...