Каждый раз, когда вы открываете канал или файл для чтения или записи в awk
, последний сначала проверит (используя внутренний хэш) , есть ли у него уже канал или файл с таким же имя (все еще) открыто; в этом случае будет повторно использовать существующий дескриптор файла вместо повторного открытия канала или файла.
В вашем случае все записи, которые заканчиваются на undefined
, фактически являются дубликатами; в первый раз, когда они встречаются (то есть, когда соответствующая команда date "..." -d "..."
вводится впервые), правильный результат считывается в x
. При последующих вхождениях той же даты getline
пытается прочитать вторую, третью и т. Д. Строки из исходного канала date
, даже если канал был закрыт на date
, в результате чего x
больше не назначается .
Из справочной страницы gawk
:
ПРИМЕЧАНИЕ. Если для getline используется труба, сопроцесс или сокет, или
из print или printf внутри цикла,
Вы должны использовать close () для создания нового
экземпляры команды или сокета. AWK не автоматически
закрыть трубы, розетки или сопутствующие процессы
когда они возвращают EOF.
Вы должны явно close
трубу каждый раз после прочтения x
:
close("date \"+%Y-%m-%d\" -d " $1)
Кстати, было бы нормально до sort
и uniq
uBXr0r15.txt
перед передачей в awk
, или вам нужно оригинальное упорядочение / дублирование?