Ну, как упоминалось в комментарии к вашему вопросу, dd
параметры bs
, seek
, skip
и count
- ваши друзья. Кроме того, я бы логично разделил ваши изображения на список фрагментов подходящего размера (скажем, по 10 МБ каждый) и поддержал бы md5sum каждого фрагмента (или более длинный хэш, если вы опасаетесь коллизий, чего я бы не стал). Когда появляется новый образ, вам нужно только проверить новый образ по хэшам (практически вдвое сократить время сравнения) и скопировать на диск только измененные фрагменты. Вы даже можете обнаружить, что некоторые из ваших фрагментов идентичны (возможно, все нули), и соответствующим образом выполнить дальнейшую оптимизацию.
Опираясь на ответ pfnuesel ,
{
split($3, a, "|")
split($4, b, "|")
if (a[2] > b[2]){
$3=b[1]"|"b[2]
$4=a[1]"|"a[2]
}
key=$3" "$4
split(arr[key], c, " ")
if ($8 > c[8] || ($8 == c[8] && $7 > c[7])){
arr[key] = $0
}
}
END{
for (item in arr){
print(arr[item])
}
}
Это предполагает,как показано (, но явно не указано )в вопросе, что значения в третьем и четвертом столбцах имеют вид
some_string | number
где пробелы даны только для иллюстрации, и строка не содержит символов |
. Эти токены должны быть отсортированы на основе значений числа s; префиксы строки не сравниваются.
Как и в ответе pfnuesel , используется
awk -f script.awk file1
Точный интервал во входном файле теряется, но читаемый интервал между столбцами может быть (повторно )создан путем передачи через column -t
; например,
awk -f script.awk file1 | column -t > file2
Вот не -изящное awk
решение:
{
split($3, a, "|")
split($4, b, "|")
if (a[2] > b[2]){
$3=b[1]"|"b[2]
$4=a[1]"|"a[2]
}
split(arr[$3" "$4], c, " ")
if ($8 > c[8]){
arr[$3" "$4] = $0
}
}
END{
for (item in arr){
print(arr[item])
}
}
Выполнить с
awk -f script.awk input
Он не сохраняет интервал, и порядок является случайным.