Pesquisa na coluna específica para padrão e saída da linha inteira

4

Estou trabalhando no HDFS e estou tentando obter toda a linha onde a quarta coluna começa com o número 5:

100|20151010|K|5001
695|20151010|K|1010
309|20151010|R|5005
410|20151010|K|5001
107|20151010|K|1062
652|20151010|K|5001

Por isso, deve produzir:

100|20151010|K|5001
309|20151010|R|5005
410|20151010|K|5001
652|20151010|K|5001
    
por Kit Goodman 02.12.2015 / 23:47

2 respostas

3

A abordagem mais simples provavelmente seria awk :

awk -F'|' '$4~/^5/' file

O -F'|' define o separador de campo como | . O $4~/^5/ será verdadeiro se o quarto campo começar com 5 . A ação padrão para awk quando algo é avaliado como true é imprimir a linha atual, portanto, o script acima imprimirá o que você deseja.

Outras opções são:

  • Perl

    perl -F'\|' -ane 'print if $F[3]=~/^5/' file
    

    Mesma ideia. A opção -a faz com que perl divida seus campos de entrada no valor fornecido por -F na matriz @F . Em seguida, imprimimos se o quarto elemento (campo) da matriz (matrizes começa a contar em 0) começa com 5 .

  • grep

    grep -E  '^([^|]*\|){3}5' file 
    

    A regex corresponderá a uma string de não | seguida por | 3 vezes e, em seguida, a 5 .

  • GNU ou BSD sed

    sed -En '/([^|]*\|){3}5/p' file 
    

    O -E ativa as expressões regulares estendidas e o -n suprime a saída normal. O regex é o mesmo que o grep acima e o p no final faz com que sed imprima apenas linhas correspondentes à regex.

por 02.12.2015 / 23:55
1

Isso imprimirá todas as linhas que correspondem a |5 e, depois, não mais | até o final da linha:

grep '|5[^|]*$' <in >out
    
por 02.12.2015 / 23:55