Imprime o padrão de repetição

4

Eu tenho um arquivo de maratona do qual eu quero imprimir os nomes dos corredores, que fizeram várias corridas. Algo como:

M, 2:08:58.0, John Lukas, USA, 1997-07-25, Paris, France

F, 2:15:04:0, Abebbe Boukari, KEN, 2000-10-01, London, UK 

e assim por diante

Eu tentei com o uniq, mas isso não acontece:

uniq -d marathon | grep "[[:alpha:]]\+[ ]\+[[:alpha:]]"
    
por Highlights Factory 08.12.2014 / 09:25

2 respostas

1

Outro script simples e alternativo (para quem não quer / sabe awk ) será:

#!/bin/bash
sort -t',' -k 3 marathon | cut -d',' -f 3 | uniq -d

se alguém quiser imprimir uma linha inteira em vez de apenas nomes:

#!/bin/bash
sort -t',' -k 3 marathon | cut -d',' -f 3 | uniq -d | grep -f - marathon

em mais de scripts:

  • sort recebe o terceiro campo para classificar, usando , como separador da opção -t e terceiro campo da opção -k
  • O comando cut apenas corta o terceiro campo usando , como separador
  • A opção -d para uniq apenas imprime linhas duplicadas, que é o que o autor da pergunta queria - "Imprimir padrão de repetição"
  • A opção -f recebe entrada do pipe (ou seja, nomes) e pesquisa no arquivo de maratona para fornecer uma linha inteira em vez de apenas nomes
por 08.12.2014 / 11:16
3

Você precisa classificar usando nomes primeiro.

Note: 'uniq' does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use 'sort -u' without 'uniq'.

Você pode usar as opções -t/-k para classificar esses campos:

sort -t',' -k 3 marathon

desse tipo em relação ao 3º campo com a vírgula como separador.

Em seguida, você pode imprimir apenas a terceira coluna com o awk e, em seguida, usar o comando uniq :

sort -t',' -k 3 marathon | awk -F, '{print $3}'|uniq -d

/! \ não testado

Se você quiser manter todas as linhas, você pode usar o awk para salvar o número de vezes que o nome aparece ( count[$3]++ ); guarde todas as linhas para os nomes ( lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0; : se for o primeiro, armazene as linhas, mais adicione). Ao final, se contar número ≥ 2, imprima as linhas para os nomes ( if(count[i]>1){ print lines[i]} ):

sort -t',' -k 3 marathon | awk -F, '{count[$3]++;lines[$3]=lines[$3]?lines[$3]+"\n"+$0:$0;}END{for (i in count){if(count[i]>1){ print lines[i]}}}'
    
por 08.12.2014 / 09:31