encontre duas linhas repetidas consecutivas

5

como encontrar duas linhas repetidas de concatenação em arquivos

por exemplo, neste arquivo, temos apenas duas linhas repetidas de concatenação

 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter <--
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter <--
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
    
por yael 24.01.2017 / 00:40

3 respostas

6

Uniq deve ser suficiente:

$ cat c.txt
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml

$ uniq -D c.txt
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter

$ uniq c.txt
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
 OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
 OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml

Por padrão, o uniq verifica as linhas adjacentes do arquivo de entrada. Assim, para um arquivo não classificado (como o seu caso), o uniq fará o trabalho que você deseja.

você também pode estar interessado na opção uniq -d e -u. Veja man page para mais detalhes (-d imprime apenas uma das duas linhas duplicadas, -u imprime somente linhas uniq - remove ambas as entradas duplicadas).

    
por 24.01.2017 / 00:52
3

Outra opção:

grep -zPo '\n(.+)\n\n'

Dessa forma, podemos adicionar ajustes extras (por exemplo, aceitar espaços extras, etc.)

Upgrade: como @thor apontou, isso não está capturando repetições no início do arquivo. Para cobrir essa situação, use

grep -zPo '(?<!.)(.+\n)' 
    
por 24.01.2017 / 01:02
0

Ainda outra opção com o AWK:

awk 'x !~ $0; {x=$0}'

Dessa forma, você pode obter o mesmo comportamento que o uniq, mas também pode fazer por coluna.

awk -F/ 'x !~ $2; {x=$2}'

-F define o separador de campo.

Dessa forma, você remove linhas nas quais o segundo campo é consecutivamente igual ao segundo campo da linha anterior.

$ cat c.txt
 line/one
 line/two
 otherline/two
 yetanotherline/two
 line/three

$ awk -F/ 'x !~ $2; {x=$2}' c.txt
 line/one
 line/two
 line/three
    
por 23.05.2017 / 19:50