вы можете попробовать эту 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
Если вы хотите повторно передать файл на другой компьютер через сетевое соединение, используйте 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
Вам, вероятно, следует взглянуть наsplit
:
Вот справочная страница с примерами: