Como mostro toda a linha de texto?

1

Exemplo das minhas informações:

Fruit,Quantity:Cost,Sold
Red Apple,10,1,5
Green Apple,10,2,20
Orange,20,1,10

Aqui está o meu código:

if      [ "$fruit != $blank" ] && [ "$quantity" == "$blank" ]; then
        cut -d\, -f1 information.txt | grep $fruit
elif    [ "$quantity != $blank" ] && [ "$fruit" == "$blank" ]; then
        cut -d\, -f2 information.txt | grep $quantity 

Meu código exibirá apenas a pesquisa pretendida, portanto, se você digitar "Apple", ele exibirá apenas "Red Apple" e "Green Apple", mas não a quantidade, como faço para exibir todas as informações. O mesmo que quantidade, se você digitar "20", ele exibirá apenas "20".

    
por Zac 11.01.2015 / 14:22

1 resposta

1

Seu cut está efetivamente removendo as informações que você está procurando da entrada que você alimentou para grep . Use apenas

grep "^[^,]*$fruit[^,]*" information.txt

em vez de

cut -d\, -f1 information.txt | grep $fruit

e

grep "^[^,]*,$quantity$" information.txt

em vez de

cut -d\, -f2 information.txt | grep $quantity

para filtrar as linhas de seu interesse. O regexp:

  • ^ inicia a correspondência no início da linha;

  • [^,]* corresponde a qualquer sequência que não contenha uma vírgula ( , );

  • $fruit corresponde à string contida na variável de ambiente fruit ;

  • o outro [^,]* deve ser óbvio neste momento.

Depois de adicionar mais campos aos seus dados, talvez seja necessário modificar os regexps - nesse caso, qualquer tutorial sobre eles será útil, a sintaxe está na página grep(1) man (ou seja, use: man grep ).

Se você insistir em usar cut e sua entrada estiver classificada, poderá colocar as informações novamente usando join (para o primeiro caso):

inf=information.txt
cut -d, -f1 $inf | grep "$fruit" | sort -u | join -t, -j 1 - $inf
  • cut gera o primeiro campo ( -f1 ) do arquivo cujo nome está contido na variável de ambiente inf , onde os campos são delimitados por uma vírgula ( -d, );

  • grep veja acima;

  • sort classifica e remove as duplicatas ( -u );

  • join une linhas de sua entrada padrão (o - no próximo ao último argumento) com o conteúdo do arquivo fornecido como o último argumento. Ele usa uma vírgula como um separador de campo ( -t, ) e une linhas cujos primeiros campos são idênticos ( -j 1 ).

O requisito de ter dados classificados vem de join (pelo menos aquele no pacote coreutils) - Eu não verifiquei como grandes problemas você poderia encontrar dados não classificados.

    
por 11.01.2015 / 17:30