Dado que es una propiedad de cada archivo, debe calcular JOBID
al procesar la primera línea de cualquier archivo, es decir, cuando FNR
es 1:
awk -F";" 'BEGIN { OFS = FS }
FNR == 1 { JOBID=substr(FILENAME, match(FILENAME, "[0-9]{8}"), 8); print }
FNR > 1 { print $0, JOBID }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head
Hay varias formas de extraer una coincidencia para una expresión regular; Por lo general, match
en una matriz:
awk -F";" 'BEGIN { OFS = FS }
FNR == 1 { match(FILENAME, "([0-9]{8})", a); JOBID = a[1]; print }
FNR > 1 { print $0, JOBID }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head
idealmente con algún manejo de errores. Esto usa match
para buscar coincidencias de texto [0-9]{8}
,y extrae cualquier valor coincidente en la matriza
(match
busca grupos, de ahí los paréntesis agregados ).
Otro enfoque que debería funcionar en cualquier implementación de AWK es dividir el nombre del archivo en guiones bajos:
awk -F";" 'BEGIN { OFS = FS }
FNR == 1 { split(FILENAME, a, "_"); JOBID = a[2]; print }
FNR > 1 { print $0, JOBID }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head
La salida duplicada en su versión ocurre porque JOBID=substr(FILENAME,match(FILENAME,"[0-9]{8}"),8)
es una expresión completa con el mismo peso que cualquier otra en su programa AWK, con un bloque implícito (, es decir,print
); siempre coincide, porque JOBID
siempre no -está vacío y no es un valor numérico igual a cero, por lo que su bloque siempre se procesa.
Мой (больший )опыт связан с BSD, и их наносонсоответствует POSIX.1 (IEEE Std 1003.1 -2008 ). Похоже, что это связано с libc
. Так что (даже в Linux )вы могли бы найти некоторые подсказки в time.h
. Вы вполне можете найти некоторые указатели на (высокоточные )таймеры, которые вы ищете. У меня нет под рукой ящика с линуксом. Так что я не могу подтвердить. Но ХТХ!:)
Минимальное время ожидания с помощью nanosleep()
зависит от нескольких факторов:
При значении резерва таймера по умолчанию, равном 50 мкс , даже при вызове nanosleep с длительностью 0 нс или 1 нс вы фактически ожидаете 50 мкс или около того по умолчанию, если ваш процесс работает в нормальном режиме (ДРУГОЕ )планирование.
Вы можете отключить механизм резерва таймера с помощью вызова prctl()
или запустив процесс в классе планирования в реальном времени.
Тем не менее, вызов nanosleep по-прежнему приводит к добровольному переключению контекста, что занимает около 3 мкс, в зависимости от вашего оборудования.
На самом деле не существует прямого способа запросить точность/точность таймера, используемого наносном. POSIX указывает, что nanosleep должен сравниваться с CLOCK_REALTIME
, и вы можете запросить его разрешение с помощьюclock_getres()
. Однако точность/точность таймера может быть ниже этого.
Но вы можете просто косвенно запросить точность/точность nanosleep, вызвав его для некоторых небольших значений с несколькими повторениями, при запуске программы, например. 1 нс, 1 мкс, 10 мкс, и измерьте его реальное время выполнения по сравнению с clock_gettime(CLOCK_REALTIME)
или по сравнению с ЦП TSC .