Estou trabalhando em um arquivo CSV nomeado Event_42417555_2018-05-23_16\:45\:28-log.txt
e formatado assim:
timestamp;fullpath;event;size
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324
1521540649.02;/home/workdir/quad_list_14.json;IN_OPEN;2160
1521540649.03;/home/workdir/quad_list_14.json;IN_ACCESS;2160
1521540649.03;/home/workdir/quad_list_14.json;IN_CLOSE_NOWRITE;2160
O que eu quero é adicionar uma coluna a este arquivo com base em um valor no nome do arquivo extraído com regex [0-9]{8}
(e remover o cabeçalho).
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324;42417555
1521540649.02;/home/workdir/quad_list_14.json;IN_OPEN;2160;42417555
1521540649.03;/home/workdir/quad_list_14.json;IN_ACCESS;2160;42417555
1521540649.03;/home/workdir/quad_list_14.json;IN_CLOSE_NOWRITE;2160;42417555
Com as ferramentas gnu é fácil, seria assim (pouco testado e quase certo que há algum problema com aspas de alguma forma):
#!/bin/bash
#$1 being the filename
JOBID=$(grep -oE "[0-9]{8}" "${1}")
sed -E "s/(.*)/\1;$JOBID/" "${1}"
Eu quero conseguir isso awk
até agora aqui o que funcionou melhor :
awk -F";" 'JOBID=substr(FILENAME ,match(FILENAME,"[0-9]{8}"),8); \
BEGIN { OFS=";"} { if ($1 != "timestamp") print $0,JOBID; }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head
timestamp;fullpath;event;size
timestamp;fullpath;event;size
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324;42417555
Eu tenho minha variável e ela está definida corretamente, mas não consigo encontrar a posição adequada para ela.
Se eu mover o JOBID=substr(FILENAME ,match(FILENAME,"[0-9]{8}"),8);
não consigo acessar a variável.
O problema aqui é que o arquivo é processado duas vezes, uma corretamente (embora minha condição seja ignorada) e a outra onde considerou minha variável
Como é uma propriedade de cada arquivo, você deve calcular
JOBID
ao processar a primeira linha de qualquer arquivo, ou seja , quandoFNR
é 1:Existem várias maneiras de extrair uma correspondência para uma expressão regular; Eu normalmente colocaria
match
em uma matriz:idealmente com algum tratamento de erro. Isso usa
match
para procurar correspondência de texto[0-9]{8}
e extrai todos os valores correspondentes na matriza
(match
procura por grupos, daí os parênteses adicionados).Outra abordagem que deve funcionar em qualquer implementação AWK é dividir o nome do arquivo em sublinhados:
A saída dobrada na 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 no seu programa AWK, com um bloco implícito ( ou sejaprint
); sempre corresponde, poisJOBID
é sempre não vazio e não é um valor numérico igual a zero, portanto seu bloco é sempre processado.