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 ambientefruit
; -
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 ambienteinf
, 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.