Хешировать файл блоками по 64 МБ?

вы можете попробовать эту awk

$ awk 'NR==1{print; next}NR!=1{if(!($1 in Arr)){printf("\t%s\n%s\t%s\t%s",a,$1,$2,$3);Arr[$1]++}else{a=$NF}}END{printf("\t%s\n",a)}' input.txt
Id       Chr     Start   End

Prom_1  chr1    3978952 3979193
Prom_2  chr1    4379047 4379622
Prom_3  chr1    5184469 5184496

awk '
NR==1{print; next}
NR!=1{
if(!($1 in Arr))
{
       printf("\t%s\n%s\t%s\t%s",a,$1,$2,$3);Arr[$1]++;
}
else
{
    a=$NF
}
}
END{
printf("\t%s\n",a)
}' input.txt
1
19.05.2017, 05:22
2 ответа

Если вы хотите повторно передать файл на другой компьютер через сетевое соединение, используйте rsync.

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

Этот метод основан на том, что head -c оставляет позицию в файле там, где она была остановлена, и предварительно вычисляет размер, чтобы знать, где закончить цикл.

n=$(($(wc -c <very_large_file) / (64*1024*1024) + 1))
i=0
while [ $i -gt $n ]; do
    head -c 64m | sha256sum
    i=$((i+1))
done <very_large_file

Этот метод основан на том, что head -c оставляет позицию в файле на том месте, где он был остановлен, и использует cksum для нахождения размера каждого фрагмента (короткий фрагмент указывает на конец фрагмента). файл).

while true; do
    output=$(head -c 64m | cksum)
    size=${output#* }; size=${output%% *}
    if [ $size -eq 0 ]; then break; fi
    echo "$output"
done <very_large_file

Этот метод вызывает dd для перехода к желаемой начальной позиции для каждого фрагмента.

n=$(($(wc -c <very_large_file) / (64*1024*1024) + 1))
i=0
while [ $i -gt $n ]; do
    dd if=very_large_file ibs=64m skip=$i count=1 | sha256sum
    i=$((i+1))
done <very_large_file
1
27.01.2020, 23:24

Вам, вероятно, следует взглянуть наsplit:

Вот справочная страница с примерами:

https://ss64.com/bash/split.html

0
27.01.2020, 23:24

Теги

Похожие вопросы