Encontrando duplicatas com os primeiros 12 caracteres de cada linha [duplicado]

4

Eu tenho um arquivo assim ...

abc100200300 abmen
abc100200300 arcxi
xyz200300300 aelmi

Como imprimo as linhas que têm duplicatas (baseadas no exame dos primeiros 12 caracteres) em um arquivo separado?

então no arquivo separado eu deveria ter

abc100200300 abmen
abc100200300 arcxi
    
por logger 23.01.2018 / 15:01

5 respostas

7

Não tenho certeza se é uma opção padrão ou uma extensão do GNU, mas se o seu uniq tem um sinal -w :

   -w, --check-chars=N
          compare no more than N characters in lines

Então

sort file | uniq -D -w12
abc100200300 abmen
abc100200300 arcxi

ou redirecionado para um novo arquivo

sort file | uniq -D -w12 > newfile
    
por 23.01.2018 / 15:15
4

Um caminho:

cut -c -12 file | uniq -d | grep -f - file

Extraia os primeiros 12 caracteres, obtenha os duplicados e obtenha as linhas correspondentes ao padrão duplicado.

    
por 23.01.2018 / 15:11
1

Uma abordagem de passo duplo com GNU awk que preserva a ordem no arquivo de entrada:

gawk -v FIELDWIDTHS=12 '
  ARGIND == 1 {c[$1]++; next}
  FNR == 1 {for (i in c) if (c[i] < 2) delete c[i]}
  $1 in c' inputFile inputFile

O equivalente POSIX:

awk '
  {key = substr($0, 1, 12)}
  !first_pass_done {c[key]++; next}
  FNR == 1 {for (i in c) if (c[i] < 2) delete c[i]}
  key in c' inputFile first_pass_done=1 inputFile
    
por 23.01.2018 / 16:23
1
Solução

sort + awk (para linhas de 2 campos):

Amostra input.txt :

abc100200300 abmen
abc100200300 arcxi
xyz200300300 aelmi
wwwunix&linx good
wwwunix&linx fine
wwwunix&linx great
someotherone other
sort input.txt | awk '$1==f1{ if ($1!=prev) print f1,f2; print }{ prev=f1; f1=$1; f2=$2 }'

A saída:

abc100200300 abmen
abc100200300 arcxi
wwwunix&linx fine
wwwunix&linx good
wwwunix&linx great

Versão do GNU awk :

awk '{ a[$1][++c]=$2; if(!$1 in a) c=0 }
     END{ for (k in a) 
              if (length(a[k]) > 1) { 
                  for (i in a[k]) print k,a[k][i] 
              } 
     }' input.txt
    
por 23.01.2018 / 16:07
-1

Eu fiz usando abaixo o comando awk e sed

Inputfile

abc100200300 abmen
abc100200300 arcxi
xyz200300300 aelmi

script

#!/bin/bash
for i in 'awk '{print substr($1,1,12)}' Inputfile | sort | uniq'
do
j='sed -n "/$i/p" Inputfile| wc -l'
if [[ $j > 1 ]]
then
sed -n "/$i/p" Inputfile>> /var/tmp/new_file_duplicate.txt
fi
done

New_file_duplicate.txt contém abaixo do conteúdo

abc100200300 abmen
abc100200300 arcxi
    
por 23.01.2018 / 15:59