Apenas para algo diferente ...
O script a seguir não usa grep
na segunda vez. Ele depende apenas dos números de linha reunidos pelo grep no primeiro passo e usa sed
para a impressão.
grep -HnZ
é usado na primeira etapa: H
para o nome do arquivo, n
para o número da linha e Z
para um delimitador sem texto \x00
entre o nome do arquivo e o linenumber.
Eu não acho que será muito (se houver) mais rápido do que executar grep
sobre os arquivos que foram idendificados no primeiro caminho, porque cada um dos arquivos identificados precisa ser verificado em ambos os casos. Também não é preciso se alguma alteração relevante na entrada do conjunto de dados no primeiro passo. (Isso só pegou meu interesse, então aqui está ..)
# create 2 test files.
printf '%s\n' {a..z} >junk1
printf '%s\n' {a..z} >junk2
# Make list of filenames and line numbers
# then convert the list into a shell script
# which uses 'sed' to list the lines
grep -HnZ "[gms]" junk1 junk2 |
# Make list of filenames and line numbers
awk -v"C=2" 'BEGIN{ FS="[\x00:]"
print "#!/bin/sh"
}
{ negC=$2-C; if (negC<1){negC=1}; posC=$2+C }
prev != $1 {
if( prev ) print prev_grp "\""
prev = $1
prev_grp = "<\"" $1 "\" sed -nr \"" \
negC"i -- ("negC","$2","posC") "$1"\n\t"negC","posC"{p;b};"
next
}
{ prev_grp = prev_grp" " \
negC"i -- ("negC","$2","posC") "$1"\n\t"negC","posC"{p;b};"
}
END{ if( prev ) print prev_grp "\"" }
'>junk.sh
chmod +x junk.sh
./junk.sh
Esta é a saída do comando inicial grep
, mostrando o valor nulo como \x00
junk1\x007:g
junk1\x0013:m
junk1\x0019:s
junk2\x007:g
junk2\x0013:m
junk2\x0019:s
Aqui está o script gerado
#!/bin/sh
<"junk1" sed -nr "5i -- (5,7,9) junk1
5,9{p;b}; 11i -- (11,13,15) junk1
11,15{p;b}; 17i -- (17,19,21) junk1
17,21{p;b};"
<"junk2" sed -nr "5i -- (5,7,9) junk2
5,9{p;b}; 11i -- (11,13,15) junk2
11,15{p;b}; 17i -- (17,19,21) junk2
17,21{p;b};"
Aqui está a saída parecida com o grep (n, n, n) que são os filtros de linha (de, correspondidos, para)
-- (5,7,9) junk1
e
f
g
h
i
-- (11,13,15) junk1
k
l
m
n
o
-- (17,19,21) junk1
q
r
s
t
u
-- (5,7,9) junk2
e
f
g
h
i
-- (11,13,15) junk2
k
l
m
n
o
-- (17,19,21) junk2
q
r
s
t
u
Seria bonito simplesmente adicionar cor, mas seria mais fácil usar grep
(a menos que isso ofereça algo desejável).