Remover linhas adjacentes que correspondam ao padrão [duplicado]

0

Entrada: arquivo com linhas ordenadas

Saída: arquivo com linhas 'exclusivas' que correspondem a linhas adjacentes se quisermos remover todos os dígitos

Exemplo

Entrada

abbylove2007
abbylove2008
abbylove2012
AbbyLove2014
abby1994lover
abby2007lover
abbylovesaal2018
abbylovesbsb2003

Saída

abbylove2007
abby1994lover

Aqui abbylove2007 e abby1994lover são deixados, pois há mais de uma linha adjacente que corresponde a abbylove \ d + e abby \ d + lover

    
por dizcza 16.07.2018 / 21:11

2 respostas

2
$ awk '{ curr=$0; gsub("[0-9]","",curr) } curr != prev { prev=curr; prevfull=$0; flag=0; next } !flag { print prevfull; flag=1 }' test
abbylove2007
abby1994lover

Primeiro, remova os dígitos da linha atual. Se o resultado disso for diferente da linha anterior com os dígitos removidos, atualize a linha anterior com essa linha, lembre-se da linha anterior completa e defina a variável flag para zero e continue com a próxima linha.

A variável flag é usada quando a linha de saída é a mesma da linha anterior para garantir que somente a saída destas linhas seja

.

Para linhas que são iguais à linha anterior (dígitos removidos), se o sinalizador não estiver definido, imprima a linha anterior completa e defina o sinalizador.

    
por 16.07.2018 / 21:35
0

Isso seria um equivalente sed modado de uniq -d :

sed '$!N; s/^\([^0-9]*\)\(.*\)\n[0-9].*$//; t; D'
    
por 16.07.2018 / 22:03