Eu tenho um conjunto de arquivos em um diretório. E todo arquivo terá uma linha chamada ---PUBG-xxxxx--
ou ---PUBG-xxxxx, PUBG-yyyyy ----
. Abaixo está a saída do comando grep.
grep "^--" FILE*.sql | grep "PUBG"
FILE1.sql:---PUBG-10901--
FILE2.sql:---PUBG-11617--
FILE3.sql:---PUBG-11625--
FILE4.sql:--PUBG-11724--
FILE5.sql:---PUBG-11720, PUBG-11406---
FILE6.sql:---PUBG-11403---
FILE7.sql:---PUBG-12021--
FILE8.sql:---PUBG-12207--
FILE9.sql:---PUBG-12270--
FILE10.sql:---PUBG-12552--
FILE11.sql:--- PUBG-14284--
FILE12.sql:--- PUBG-10908--
FILE13.sql:--- PUBG-15136---
FILE14.sql:--- PUBG-15163---
FILE15.sql:--- PUBG-15166---
FILE16.sql:-- PUBG-15059 --
FILE17.sql:-- PUBG-15252 --
O PUBG e seus números serão aleatórios. Tudo o que preciso é o nome do arquivo e seu valor PUBG associado sem nenhum --
antes ou depois do PUBG e seu valor. Também pode haver vários PUBGs como em FILE5.sql:---PUBG-11720, PUBG-11406---
. Eu escrevi o conjunto abaixo para loop.
for (i in `grep "^--" FILE*.sql | grep "PUBG"`)
do
FILE_NAME=`echo ${i} | awk -F ":" {'print $1'}`
PUBG_NO=`echo ${i} | awk -F "PUBG-" {'print "PUBG-" $2'}`
echo ${FILE_NAME}
echo ${PUBG_NO}
done
Mas a saída de amostra para PUBG_NO
é PUBG-15166---
para FILE15.sql
e é PUBG-11720,
para FILE5.sql
.
Eu preciso de todos os valores PUBG em um arquivo para FILE_NAME específico sem nenhum arquivo --
. O valor PUBG de FIlE5.sql pode ser PUBG-11720, PUBG-11406
Como esse loop pode ser melhorado para buscar os resultados exatos.
Você não precisaria escrever um loop. Você poderia simplesmente canalizar sua saída para sed. Minha tentativa é a seguinte:
O que daria
Aqui, estou usando um comando sed substitue que assume a forma de
Para detalhar ainda mais o comando:
Você também pode aplicar esses conceitos ao seu comando grep inicial para realizar apenas uma pesquisa.
Seguindo AWK:
Vai dar esta saída:
São levados em consideração apenas 5 arquivos:
Isso passaria pelos arquivos SQL originais e substituiria seu pipeline.
O
awk
código extrai todas as linhas que começam com--
e que contêm a stringPUBG
. Para cada uma dessas linhas, ele passa pelas entradas delimitadas por vírgulas e remove qualquer traço e espaço do início e do final de cada uma. Após o corte, ele imprime aPUBG-NNNN
string resultante prefixada pelo nome do arquivo em que foi encontrado.