Разные результаты от awk и nawk

Я только что выполнил эти две команды в файле, содержащем около 250 миллионов записей.

awk '{if(substr($0,472,1)=="9") print $0}' < file1.txt >> file2.txt

а также

nawk '{if(substr($0,472,1)=="9") print $0}' < file1.txt >> file2.txt

Длина записи составляет 482. Первая команда дала правильное количество записей в file2.txt, т.е. 60 миллионов, но команда nawk дает только 4,2 миллиона.

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

был бы признателен, если кто-то может пролить свет на это.

Детали моей ОС

SunOS <hostname> 5.10 Generic_147148-26 i86pc i386 i86pc

2 ответа

Решение

Разница, вероятно, заключается в ограничении буфера Nawk. Одна из записей (строк), найденных в вашем входном файле, вероятно, превысила его.

Эту важную строку можно найти в awk.h:

#define RECSIZE (8 * 1024)  /* sets limit on records, fields, etc., etc. */

Ваша команда может быть уменьшена до этого:

awk 'substr($0,472,1)==9'

На Солярисе (который у вас включен) при запуске awk по умолчанию вы используете старый, сломанный awk (/usr/bin/awk), поэтому я подозреваю, что nawk - это тот, кто дает правильный результат.

Запустите / usr / xpg4 / bin / awk с тем же сценарием / аргументами и посмотрите, с какими другими результатами он согласен.

Кроме того, проверьте, был ли ваш входной файл создан в Windows, запустив на нем dos2unix, и посмотрите, изменяется ли его размер, и, если это так, повторно запустите команды awk для измененных файлов. Если он был создан в Windows, то там будет несколько управляющих элементов, которые могут вызывать хаос.

Другие вопросы по тегам