Split usando sed

1

Eu tenho que dividir

[X] ||| you owns the [X,1] ||| you own the [X,1] ||| 1 0.02020 0.07847 0.36788 3 -0.00000 -0.00000

nos tubos e saída dessas linhas cujo 2º e 3º argumento são diferentes.

    
por user38751 08.05.2013 / 08:38

2 respostas

3

Algumas explicações do comentário / resposta @ manatwork:

  • grep versão: grep '^[^|]\+|||\(.\+\?|||\)'

    • ^ : corresponde ao começo da linha
    • [^|] : corresponde a qualquer caractere com exceção |
    • \+ : corresponde uma ou mais vezes ao padrão anterior
    • ||| : corresponde ao seu separador
    • \( e \) : salve o valor correspondente entre parênteses em
    • . : corresponde a qualquer caractere
    • \+\? : uma ou mais vezes, mas não ganancioso
    • ||| : corresponde ao seu separador novamente
    • : corresponde ao texto anterior visto entre parênteses

    A ideia aqui é pular o início da linha até o primeiro separador, depois salvar o valor encontrado até o final do segundo separador e depois corresponder apenas à linha que tenha exatamente o mesmo valor que após o segundo operador (significando o 3º campo)

  • sed versão: sed -n '/^[^|]\+|||\(.\+\?|||\)/p'

    O mesmo significado de grep , com um / adicional no início e no final da linha para indicar o padrão, além de um caractere de comando extra p no final para imprimir linhas correspondentes.

  • awk versão: awk -F'\|\|\|' '$2==$3'

    • -F'\|\|\|' : indique o separador de campos: ||| escape neste caso
    • '$2==$3' : entrada de filtro somente onde o segundo e terceiro campo são iguais
por 08.05.2013 / 10:38
0

Eu prefiro a solução awk , mas se você quiser usar o Bash somente, aqui está minha resposta:

foo() 
{ 
    local filename="$1";
    [[ $filename ]] || return 1

    while read -r line; do
        l="${line#*|||}"; a2="${l%%|||*}"
        l="${l#*|||}"; a3="${l%%|||*}"
        [[ $a2 = $a3 ]] && echo "$line"
    done < "$filename"
}

Uso: foo filename.txt

Exemplo de saída:

rany$ cat > filename.txt
a|||b|||c|||d|||
a|||b|||c|||d|||
a|||E|||E|||d|||
a|||B|||B|||d|||

rany$ foo filename.txt
a|||E|||E|||d|||
a|||B|||B|||d|||
    
por 10.05.2013 / 22:23

Tags