Разные результаты от 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, то там будет несколько управляющих элементов, которые могут вызывать хаос.