awk - обработка двух файлов

Программы, которые вы использовали, взяты из неисправной вилки и дистрибутивов Linux, которые не распространяют оригинальный cdrecord, но форк, созданный в мае 2004 года, никогда не обновлял программное обеспечение, чтобы получить более свежие функции и исправления ошибок. Дистрибутивы, которые поставляют "wodim", также поставляют другое дефектное программное обеспечение, такое как, например, genisoimage вместо настоящего mkisofs.

Даже в исходном mkisofs от мая 2004 года было много ошибок, но в Debian genisoimage добавлено много дополнительных ошибок в 2004 году.

Летом 2006 года все известные ошибки были исправлены в исходном программном обеспечении, а с мая 2004 года (когда вилка вы используете, было создано) оригинальное программное обеспечение удвоило его функции.

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

https://sourceforge.net/projects/cdrtools/files/

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

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

1
28.03.2018, 09:20
2 ответа

paste +awkмагия:

paste -d':' reference target | awk -F':' \
'$1 == $4 && $2 != $5 && $6 > $3{ 
     if ($5 == "!"){ p = "but"; state = "disabled" }
     else { p = "and"; state = "different" }
     printf "%s:target has bigger $3(%d > %d) %s $2 %s (%s)\n", $1, $6, $3, p, state, $5 
}'

Выход:

42:target has bigger $3(1 > 0) but $2 disabled (!)
45:target has bigger $3(2 > 1) and $2 different (B)

Дополнительноеgawkрешение (с учетом того, что значение 1-го поля упорядочено и уникально):

awk -F':' \
'NR == FNR{ 
    a[NR][1] = $1; a[NR][2] = $2; a[NR][3] = $3; next 
}
$1 == a[FNR][1] && $2 != a[FNR][2] && $3 > a[FNR][3]{ 
   if ($2 == "!"){ p = "but"; state = "disabled" }
   else { p = "and"; state = "different" }
   printf "%s:target has bigger $3(%d > %d) %s $2 %s (%s)\n", $1, $3, a[FNR][3], p, state, $2 
}' reference target
1
27.01.2020, 23:32
awk -F: '
    FNR == NR { c2[$1] = $2; c3[$1] = $3; next }
    !($1 in c2) {
        printf("%d: $1 not found in reference\n", $1)
        next
    }
    $3 > c3[$1] && $2 == "!"    {
        printf("%d: target has bigger $3 (%d>%d) but disabled $2 (%s)\n", $1,$3,c3[$1],$2)
        next
    }
    $3 > c3[$1] && $2 != c2[$1] {
        printf("%d: target has bigger $3 (%d>%d) but different $2 (%s)\n", $1,$3,c3[$1],$2)
    }' reference target

При этом считывается эталонный файл, а затем целевой файл.

При чтении эталонного файла(FNR == NR)он собирает значения второго и третьего столбцов в двух массивах c2и c3. В качестве индекса используется значение в первом столбце.

При чтении целевого файла(FNR != NR)значение в третьем столбце будет сравниваться с сохраненным значением в массиве c3. Затем он также сравнивает второй столбец с !или с сохраненным вторым столбцом из эталонного файла в c2.

Код также выдает дополнительное сообщение, если первый столбец целевого файла не найден в эталонном файле.

Вывод, учитывая данные в вопросе с добавленной целевой строкой(56:C:9):

42: target has bigger $3 (1>0) but disabled $2 (!)
45: target has bigger $3 (2>1) but different $2 (B)
56: $1 not found in reference
1
27.01.2020, 23:32

Теги

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