Como é uma propriedade de cada arquivo, você deve calcular JOBID
ao processar a primeira linha de qualquer arquivo, ou seja, quando FNR
for 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
Existem várias maneiras de extrair uma correspondência para uma expressão regular; Eu normalmente usaria match
em uma 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 com algum tratamento de erros. Isso usa match
para procurar texto correspondente a [0-9]{8}
e extrai todos os valores correspondentes na matriz a
( match
procura grupos, daí os parênteses adicionados).
Outra abordagem que deve funcionar em qualquer implementação do AWK é dividir o nome do arquivo em sublinhados:
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
A saída duplicada em sua versão acontece porque JOBID=substr(FILENAME ,match(FILENAME,"[0-9]{8}"),8)
é uma expressão completa com o mesmo peso de qualquer outra em seu programa AWK, com um bloco implícito ( i.e. print
); ele sempre corresponde, porque JOBID
é sempre não vazio e não um valor numérico igual a zero, portanto, seu bloco é sempre processado.