Вывод файла из программы на C странно ведет себя при подсчете строк - PullRequest
3 голосов
/ 23 июля 2011

Я использую C для анализа большого плоского файла и вывода соответствующих строк в выходной файл.Выходной файл должен быть около 70000 строк.

Если я открою файл в gedit, он отобразится точно так, как ожидается, с правильным количеством строк и длиной строк.

Однако, выполнение wc -l <file> возвращает 13,156.Так же и grep -c "" <file>.

tail <file> возвращает последние 10 строк, которые я вижу в gedit.head <file> возвращает первые 10 строк.Но tail -n +8000 | head -n 1, который должен вернуть 8000-ю строку, возвращает текст, который я вижу в строке 34,804 в gedit.

Я бы ожидал этих результатов, если бы в файле отсутствовали символы новой строки.Но у Gedit, похоже, нет проблем с этим.Кроме того, wc -L <file>, который отображает максимальную длину строки, возвращает 142 байта, как и ожидалось.Размер файла составляет чуть более 9 000 000 байт, как и ожидалось.

Если wc -L <file> = 142 и wc -c <file> = 9046609, то как может wc -l <file> = 13156?

Кто-нибудь знает, что я сделал не так при записи в этот файл?

1 Ответ

3 голосов
/ 24 июля 2011

Вероятно, это нечетная комбинация символов возврата ('\ r') и перевода строки ('\ n').

Предполагая, что у вас есть версия tr для GNU Coreutils, вы можете использовать эти команды для подсчета количества каждого символа в файле:

tr -d -c '\n' FILE | wc -c

tr -d -c '\r' FILE | wc -c

Для обычного текстового файла в стиле Unix вторая команда должна вывести 0. Для текстового файла в стиле Windows оба должны печатать одно и то же число.

Команда "file" также, вероятно, расскажет вам кое-что полезное.

...