retorna a primeira instância de caracteres de uma lista

0

Digamos que eu tenha a saída deste comando salva em um arquivo.

cat /dev/urandom | tr -dc '[:graph:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?)//g' | head -n 50

Eu gostaria de comparar apenas os primeiros n caracteres em cada linha de um arquivo e retornar apenas a primeira linha contendo a primeira instância desses caracteres.

Assim, por exemplo, sem precisar classificar o arquivo, gostaria de ver os quatro primeiros caracteres em cada linha do arquivo. Eu quero encontrar a primeira instância de qualquer seqüência de quatro caracteres em cada linha e imprimir apenas as linhas contendo as primeiras instâncias.

Eu agradeceria se o comando pudesse ser modificado para ver quatro, cinco ou seis caracteres, etc. em cada linha.

Muito obrigado pelo seu tempo e ajuda. Eu realmente tenho lutado para descobrir isso.

  • MelBurslan, o conteúdo da string deve ser irrelevante, mas a saída do comando acima - agora corrigido - é todo caractere que eu posso digitar em um teclado em inglês. Abaixo estão duas linhas de amostra.

    k!>d#&)"EtXN';*9TaD7BcL84z5[y{$Q?_Y%fCw6F0Vgn\|]ImqR.:1l<^}u'+Ms/hjS@e~2vxWO(3,bJiprP-=UAZGoHK
    3'O$#Eg5&,'l>vn491M"cVZRJ.H[XTw*:q}Kz8hf;W_P|i<6@CAytF^Dmkb]GBsU+{Y?xje%oIQ-~r!2Sap=/)N0du(L
    
  • glenn, sim, a primeira instância de uma cadeia / tecla / token de quatro caracteres. Eu também precisava que a correspondência fosse variável para poder manipular a correspondência de caracteres conforme necessário.

  • curinga, isso funcionou maravilhosamente, obrigado.

  • thrig, isso funcionou maravilhosamente, obrigado.

por J363 05.04.2016 / 21:07

2 respostas

3

Assumindo que glenn jackman paráfrase da sua pergunta está correta, aqui está uma solução usando awk e substr() :

awk '{key = substr($0,1,4)}; !(key in printed); {printed[key]}' file

Isso define "chave" para os primeiros quatro caracteres de uma linha, depois imprime a linha a menos que tenha visto essa chave antes, e depois acompanha o fato de que essa chave foi impressa.

    
por 05.04.2016 / 22:34
1

Use um hash?

% (echo foo; echo bar; echo foobar) \
  | perl -ne '/(.{3})/; print unless $seen{$1}++'
foo
bar
% 
    
por 05.04.2016 / 21:47