Qual é o script mais conciso para listar os que faltam em uma seqüência de dígitos? [duplicado]

0

Por exemplo, temos o conteúdo

001
002
004
008
010

em um arquivo de texto chamado file , como extrair o 3 5 6 7 9 ausente?

    
por Lee 12.03.2016 / 16:40

3 respostas

0

Uma awk way:

$ awk 'NR != $1 { for (i = prev + 1; i < $1; i++) {print i} } { prev = $1 + 1 }' file
3
5
6
7
9

Mais claramente:

awk 'NR != $1 {
  for (i = prev + 1; i < $1; i++) {
    print i
  }
} 
{ 
  prev = $1
}'

Para cada linha, verifico se o número da linha corresponde ao número e, se não, imprime cada número entre o número anterior ( prev ) e o número atual (exclusivo, portanto i = prev + 1 ).

    
por 12.03.2016 / 18:52
1

Minha abordagem é ter controle sobre o tamanho de seus números para que eu inicializasse duas variáveis: limite inicial e final e anexasse o limite inicial ao nome do arquivo, Loop indefinido, comparar o limite final inicial e sair se o número inicial for maior do que o número final, verifique se o arquivo existe e incremente o limite inicial.

StartNumber=$1
EndNumber=$2

while true; do
      [ ${StartNumber} -gt ${EndNumber} ] && { exit 0 ; }
      if [ ! -f ${FileName}_${StartNumber} ]; then
       echo ${StartNumber}
      fi
      ((StartNumber+=1))
done

Algumas sugestões de seus comentários:

  • Tente executar o comando de localização find . -type f e faça um loop pelos resultados.
  • Para cada arquivo produzido pelo comando acima, aplique echo ${filename} | tr -dc 0-9 para obter apenas os números.
  • Você provavelmente usaria "yyyyddd" como seu limite inicial e compare isso com a data de hoje como limite final.
por 12.03.2016 / 16:58
1

Supondo que seu arquivo de exemplo seja usado, o seguinte comando

join -a 1 -o 1.1 2.1 -e missed <(seq -f '%03g' $(tail -1 <(sort file))) file | grep missed

produzirá essa saída

003 missed 005 missed 006 missed 007 missed 009 missed

se é isso que você precisa, posso fornecer algumas explicações

    
por 12.03.2016 / 19:04