Como editar a segunda ocorrência de linhas duplicadas?

0

Eu estou procurando uma maneira de encontrar todas as linhas duplicadas que não são "não uma cor" e adicionar "é uma cor" no final da segunda ocorrência delas.

Aqui está um diff -y do que estou falando.

orginal file  - final resault

pink            pink
pink          | pink is a color
not a color     not a color
not a color     not a color 
violet          violet
violet        | violet is a color
not a color     not a color
not a color     not a color
orange          orange
orange        | orange is a color
not a color     not a color
    
por Ravexina 15.05.2017 / 22:02

4 respostas

3

awk abordagem:

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=$0" is a color" : nl }}' file

A saída:

pink
pink is a color
not a color
not a color
violet
violet is a color
not a color
not a color
orange
orange is a color
not a color

You can use ‘getline var’ to read the next record from awk’s input into the variable var.

The getline command returns 1 if it finds a record and 0 if it encounters the end of the file.

$0!="not a color" && $0 == nl - se o registro atual não for not a color string AND 2 linhas conseqüentes forem iguais (dupicates)

Uma abordagem adicional usando substr() function (para inserir " is a color " string após os primeiros 2 caracteres da "cor" duplicada crucial):

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=substr($0,1,2)" is a color "substr($0,3) : nl }}' file

A saída seria:

pink
pi is a color nk
not a color
not a color
violet
vi is a color olet
not a color
not a color
orange
or is a color ange
not a color
    
por 15.05.2017 / 22:26
1

A partir das informações fornecidas até agora:

sed 'N;s/^\([a-z]*\)\n$/& is a colour/;$! P;$! D' file

O padrão [a-z]* pode precisar ser adaptado às suas necessidades. Claro que não corresponde apenas às cores, aqui corresponde a todas as palavras com letras baixas.

Explicação: O que o script para cada linha é para acrescentar a seguinte linha com o comando N , de modo que você sempre tenha teo linhas consecutivas com uma nova linha no meio. Em seguida, o s tem o padrão para a primeira linha como uma referência de referência após a nova linha, correspondendo assim apenas às linhas repetidas. Nesse caso, o & na string de substituição insere o wholemmatch e anexa o texto especificado à segunda linha. Então P imprime até a primeira nova linha e D remove essa parte, então a segunda linha permanece para começar de novo. $! faz com que esses comandos sejam executados para todos, menos para a última linha, porque para a última linha precisamos gerar as duas linhas, o que acontece por padrão no final do script.

Teste de entrada:

pink
pink
not a colour
not a colour
orange
orange
not a colour
red
blue
blue

Dá saída:

pink
pink is a colour
not a colour
not a colour
orange
orange is a colour
not a colour
red
blue
blue is a colour
    
por 15.05.2017 / 22:19
1
sed -e '
   # not interested in empty lines or blank lines
   /^$/b
   /\S/!b

   N;                        # get the next line into pattern space
   /^\(.*\)\n$/!{P;D;};    # compare 2 in the pattern space as string eq
   /\nnot a color$/b;        # 2 EQUAL, they are "not a color" => NOP
   s/$/ is a color/;         # 2 EQUAL, but not "not a color" => suffix
' your_colors.file
    
por 16.05.2017 / 09:12
0
awk '/Not a color/ { print } /pink|red|blue|red|orange/ { if( found[$1] ) { print $1, "is a color" } else { print $1; found[$1]=1 } }' /path/to/input
    
por 15.05.2017 / 22:22