Я использую awk (символическую ссылку на gawk на моем компьютере), чтобы прочитать файл и получить количество символов в строке, чтобы проверить, имеет ли файл фиксированную ширину. Затем я могу повторно использовать следующий скрипт с параметром -b --characters-as-bytes
, чтобы увидеть, имеет ли файл фиксированную ширину в байтах.
#!/usr/bin/awk -f
BEGIN {
width = -1;
}
{
len = length($0);
if (width == -1) {
width = len;
} else if (len != 0 && len != width) {
exit 1;
}
}
Я хочу сделать что-то похожее, чтобы проверить, имеет ли каждая строка в файле одинаковое количество байтов и символов, позволяющее предположить, что все символы являются одним байтом (я понимаю, что это ложные отрицания). Проблема в том, что я хотел бы один раз прогнать файл и вспомнить первое несоответствие. Есть ли способ установить параметр -b
из скрипта awk, аналогичный тому, как вы можете настроить FS. Если это невозможно, я открыт для вариантов вне awk. Я всегда могу просто написать это в C
, если нужно, но я хотел убедиться, что там уже ничего нет.
Эффективность - это то, к чему я стремлюсь. Наличие этой информации поможет мне пропустить дорогостоящий процесс, поэтому я не считаю, что это само по себе дорого. Я имею дело с файлами, длина которых может превышать 100 миллионов строк.
Уточнение
Я хочу что-то подобное выше. Примерно так
#!/usr/bin/awk -f
{
if (length($0) != bytelength($0))
exit 1;
}
Мне не нужен вывод. Я просто отключу код возврата ($?
в bash). Так что выход 1, если это не удается. Очевидно, длина байта не является функцией. Я просто ищу способ достичь этого без запуска awk дважды.
UPDATE
Решение SunDep работает для того, что я описал выше:
awk -F '' -l ordchr '{for(i=1;i<=NF;i++) if(ord($i)<0) {exit 1;}}'
Я работал в предположении, что awk
будет считать старший символ с однобайтовой кодировкой Windows выше 0x7F как один символ, но на самом деле он вообще не считается. Таким образом, длина байта все равно не будет равна длине. Я думаю, мне нужно будет написать это в C для чего-то, что специфицирует c.
Заключение
Так что я думаю, что плохо справился с объяснением своего проблема. Я получаю данные, которые закодированы в однобайтовом кодировании в стиле UTF-8 или Windows ', например, CP1252. Я хотел проверить, есть ли в файле многобайтовые символы, и выйти, если он найден. Сначала я хотел сделать это в awk, но играть с файлами, которые могут иметь другую кодировку, оказалось сложно.
В двух словах, если принять файл с одним символом:
CHARACTER FILE_ENCODING ALL_SINGLE_BYTE IN_HEX
á UTF-8 false 0xC3 0xA1
á CP1252 true 0xE1
a ANY true 0x61