Eu tenho um arquivo com uma lista de diretórios nele:
/a/b
/a/b/c
/a/b/d
/a/b/e
/a/c
/a/c/b
/a/c/d
/a/d/e
/a/d/e /f
/a/e/f/g
/a/e/f/g/h
...
Eu quero obter apenas /a/b, /a/c, /a/d/e e /a/e/f/g; ou seja, quero excluir linhas que tenham um subconjunto de outra linha antes dela. A profundidade dos subdiretórios é arbitrária, então eu poderia descer 2, 3, 4, etc. diretórios para encontrar o subdiretório exclusivo.
Supondo que sua entrada esteja classificada, que tal verificar um prefixo e atualizá-lo quando ele mudar?
OBSERVAÇÃO: esta é uma correspondência de expressão regular, portanto, pode ser inadequada se as entradas contiverem caracteres especiais regex - FWIW nem
gawk
oumawk
parecem tratar o/
como especial neste contextosaídas
Se você não tem GNU awk, então canalize a saída para
| sort
Definimos o separador de campo para
/
e, em seguida, imprimimos linhas com apenas três campos precisamente. Presumindo que o formato do arquivo de entrada seja consistente, apenas linhas como como/a/b
serão impressas, pois os três campos são, em ordem, uma string vaziaa
, eb
.Você tem que usar awk? Grep pode fazer isso. Tyy algo assim: egrep '^/a/b\$|/a/c\$'
Dependendo do seu shell, o $ pode ou não precisar ser escapado com a barra invertida.
Você pode fazer isso usando o
sed
editor como mostrado:Trabalhando:
Caso as entradas não venham ordenadas, você pode fazer da seguinte maneira:
Trabalhando: