Как проверить, является ли file1 префиксом file2?

Как manatwork уже прокомментировал, % не часть вывода от awk, это - следующая подсказка от оболочки. В END блок, для этого входного файла, существует три вызова к printf. Первые выводы 6 и пространство, вторые выводы 7 и пространство и третьи выводы 10 и пространство. После этого awk выходы и оболочка печатает ее подсказку.

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

Для проверки вывод команды полностью видим, удостоверьтесь, что он заканчивается в новой строке (если команда не производит вывода, конечно). В системах Unix непустой текстовый файл всегда заканчивается новой строкой, потому что текстовые файлы состоят из (возможно пустой) серия строк, каждая из которых состоит из (возможно пустой) серия символов кроме новой строки (и пустые байты). Большинство утилит имеет тенденцию быть разработанным для контакта, прежде всего, с текстовыми файлами, поэтому удостоверьтесь, что вывод команды является допустимым текстовым файлом.

После печати полей распечатайте a "\n" (awk нотация для символа новой строки), или вызов print функция, которая добавляет новую строку после печатаемого текста.

END { for (i=1; i<=NF; i++) printf "%d ", sum[i]; print ""; }

или, чтобы не иметь дополнительное пространство в конце строки:

END { for (i=1; i

или

END { printf "%d"; for (i=2; i<=NF; i++) printf " %d", sum[i]; print ""; }

или

END { for (i=1; i

13
08.06.2014, 02:44
3 ответа

Предположим, что в переменной FILE1_SZ имеется размер файла -c и ваша реализация head поддерживает (нестандартную) -c опцию:

if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
    echo "file1 is a prefix of file2"
else
    echo "file1 is not a prefix of file2"
fi
11
27.01.2020, 19:52

Если в вашей системе используется команда cmp от GNU diffutils, то один из вариантов -

cmp -n 124665 file1 file2

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

cmp -n "$(wc -c < file1)" file1 file2
12
27.01.2020, 19:52

GNU cmp может решить проблему более простым способом:

cmp file1 file2

Существует четыре возможных выхода (исключающих какую-либо ошибку).

  • Нет выхода: файлы идентичны.

  • cmp: EOF на file1: file1 является префиксом file2.

  • cmp: EOF на file2: file2 - префикс файла1.

  • file1 file2 отличается: байт NNN, строка MMM: Ни один из них не является префиксом другого.

К сожалению, это немного неудобно использовать в скрипте, так как эти случаи, похоже, не выделяются в коде выхода. Более того, сообщения EOF на file1 идут в stderr, а сообщение file1 file2 отличается идут в stdout.

Я полагаю, что другие версии cmp делают что-то подобное, но я не проверял.

3
27.01.2020, 19:52

Теги

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