Encontre todos os caracteres “[1-777])” no começo da linha

0

Pseudocommand

perl -pe 'g/^[1-777])/g' data.txt 

onde tento todos os números no início de uma linha com ")" seguindo-os etc 1) , 67) e 777) .

Dados em que todos os números de pergunta devem ser encontrados (etc 1) , 16) , 68) ... mas não 16. e não 778) )

1) hello 
A) Options here which should be not matched. 
16) hello 16. old
A) Options here which should be not matched. 
68) yes question
A) Options here which should be not matched. 
...
582) hurray
A) Options here which should be not matched. 
778)
A) Options here which should be not matched. 

onde encontrar apenas números até 777.

Saída desejada

1,16,68,582,777 

que eu posso alimentar para o meu comando Sed. Por último, se possível, retorne o resultado como separado por vírgulas para este comando: sed -n '1,4,582' full_data.txt , discutido aqui , portanto, alguns tipo de piping de perl para sed ou apenas em perl?

Como você pode retornar todos os números no começo da linha?

    
por Léo Léopold Hertz 준영 15.06.2015 / 13:51

2 respostas

1

Como algumas iterações de esclarecimento mostraram, apenas números inteiros e com valores não maiores que 777 devem ser coletados em uma lista separada por vírgulas. Aqui vamos nós:

awk -F ')' '$1~/^[0-9]+$/ && $1<=777 {print $1}' <datafile | paste -sd,

Nota: Para corresponder a um intervalo inteiro, você pode em awk também escrever:

awk -F ')' '$1>=1 && $1<=777 {print $1}' <datafile | paste -sd,


Eu mantenho as variantes abaixo como blocos de construção para tarefas relacionadas.

Para criar todos os números de pergunta :

cut -d ')' -f1 <datafile | paste -sd,

que cria esta saída:

1,2,3,...,582

Ou, se entradas com respostas vazias (como 777) não serão consideradas:

awk -F ') ?' '$2!="" {print $1}' <datafile | paste -sd,

Ou, se houver um limite numérico de 777 para considerar:

awk -F ')' '$1<=777 {print $1}' <datafile | paste -sd,

Ou para corresponder apenas a números inteiros no primeiro campo:

awk -F ')' '$1~/^[0-9]+$/ {print $1}' <datafile | paste -sd,
    
por 15.06.2015 / 14:19
1

Eu primeiro extraia candidatos e, em seguida, verifico o máximo 777 depois:

egrep '^[0-7]?[0-9][0-9]?)' file | sed 's/^\([0-7]\?[0-9][0-9]\?\))/ )/' | awk '($1 < 778) {print $0}' | sed 's/^\([0-7]\?[0-9][0-9]\?\) ).*/,/' | tr --delete \n | sed 's/,$/\n/'

Funciona para meus arquivos de teste. (EDIT1: O último sed agora dá apenas o número EDIT 2: removeu o trailing , )

    
por 15.06.2015 / 14:39