Eu tenho o seguinte script:
#!/bin/bash
file=$1
echo "Phone:"
read phone
echo
echo "Column:"
read column
echo
echo "New Value:"
read value
echo
index=$(cat $file | grep -n $phone | cut -d: -f1)
cat "$file" | awk -v idx="$index" -v col="$column" -v value="$value" -F ',' '{if (NR==idx) {for(i=1;i<=NF;i++) {if (i==col) $i=value; printf("%s%s", $i, (i==NF ? "\n":FS))}} else print}'
echo
exit 0
Ele recebe um arquivo e o usuário é solicitado a fornecer um número, coluna e novo valor e, em seguida, atualiza esse campo específico. meu problema é que tenho que chamá-lo assim:
./update.sh data.csv
E eu gostaria de poder transformar o script em um alias e canalizá-lo usando sinalizadores em vez de solicitar que o usuário insira valores, adicionando sinalizadores personalizados (-c para coluna, -v para valor e -e para padrão para filtrar), algo como:
cat data.csv | update -c 2 -v "value" -e "pattern"
alguém pode me explicar como transformar o script em um alias com sinalizadores? (por alias quero dizer um comando, talvez eu esteja usando a palavra alias incorretamente)
além disso, ainda estou aprendendo bash, awk e linux. Se você perceber que estou fazendo algo incorreto ou ineficiente, corrija-me.
desde já, obrigado
ps talvez ajude, aqui está a aparência de data.csv:
444-555-7777, Max,Weaver, personal:friend:musician
111-222-6665, Craig,Kowalick,office:friend
888-797-2345,Tom, O’Brien, personal:family:musician:midnightsociety
Use getopts para analisar os argumentos e, em seguida,
awk
ou algo semelhante para corresponder aos campos CSV, por exemplo (não testado):então use awk faça o que quiser com o CSV, por exemplo (novamente não testado e apenas um exemplo, não destinado a fazer o que você realmente deseja fazer com as variáveis acima, apenas mostrando como usá-las):
Isso
"${@:--}"
diz ao awk para ler o(s) nome(s) de arquivo se algum tiver sido passado ou ler stdin caso contrário.Você provavelmente desejará adicionar algum código no script shell ou no script awk para verificar se quaisquer variáveis obrigatórias foram preenchidas antes de usá-las no script awk, como mostro acima. Você poderia adicionar um código shell como este entre o loop getopts e a chamada para awk:
para garantir que as variáveis sejam preenchidas por prompt+resposta se ainda não tiverem sido definidas na linha de comando.
Presumi acima que por "padrão" em sua pergunta você deseja fazer uma correspondência de regexp estendida de linha completa, e é por isso que nomeei a variável associada
ere
em vez depat
ou semelhante. Eu sei que é contra-intuitivo, mas não use a palavra "padrão" ao declarar seus requisitos ou escrever código para correspondência de padrões. É altamente ambíguo, como ir a uma concessionária e apenas dizer ao vendedor que deseja comprar um “veículo”. Seja específico sobre que tipo de padrão você deseja corresponder em quais contextos, consulte como faço para encontrar o texto que corresponde a um padrão .