Como extrair um número comum em várias linhas?

1
http://abc/blah/hhh/25927/3456/bb
http://vfg/blahgg/hhvvh/kkk/25927/2378/bb/mm
http://lah/hhh/25927/fff/bb/somthin

nas linhas acima, o número comum é 25927 sempre ocorrendo como / 25927 / e está presente em todas as linhas. Mas o número é uma variável que não conheço antecipadamente, por isso não posso usar grep 25927 ; em vez disso, deve ser algo como grep /commonnumber present in all lines/ file

    
por munish 24.12.2016 / 05:30

3 respostas

2

perl -nE '%a = map { $.==1 || $a{$_} ? ($_,1):()} /(\d+)/g; 
          END{ say keys %a}'   file

Explicação:

  • -n adicionará um loop ao longo de todo o programa, como:

    while (<>) { ... }
    
  • -E é necessário para o perl executar a linha de comando (dentro desse loop). Também adiciona a possibilidade de usar say

  • Cada linha é passada para /(\d+)/g , que corresponde a cada número (dígitos próximos um do outro) separadamente. Cada número, se alimentado no map .

  • %a é o dicionário dos números que apareceram em todas as linhas até agora. É recalculado todas as linhas ( %a = ... ).

  • na primeira linha $. == 1 todos os números são armazenados no dicionário - o par (número 1) é adicionado; 1 significa True

  • nas outras linhas, todos os números são filtrados em () , a menos que eles também estivessem presentes na última iteração $a{$_} ? .

  • Finalmente, END{...} imprime todos os números que se repetiram em todas as linhas .

por 05.01.2017 / 15:05
1
$ awk -F/ 'NR==1{for(i=1;i<=NF;i++){Arr[$i]++}next}{for(j=1;j<=NF;j++){if ($j in Arr){Arr[$j]++}}}END{for (k in Arr){if(NR==Arr[k]&&k+0!=0){print k,Arr[k]}}}' input.txt

extraia a primeira linha com delimitador / e armazene-a na matriz. a partir da segunda linha, verifique se o campo está no array. se estiver lá na matriz, aumente o valor. No final, verifique o valor em relação ao número da linha e certifique-se de seu número.

    
por 05.01.2017 / 16:45
0

Se você sabe que serão sempre 5 dígitos em uma linha delimitada pelo caractere de barra (como no caminho acima), você pode tentar algo como:

egrep [/] [0-9] {5} [/] arquivo

O uso do egrep permite que você use a sintaxe da expressão regular estendida se estiver usando outra que não a versão GNU do grep. Veja a página man para mais informações sobre sua versão do grep.

    
por 24.12.2016 / 05:55