Você pode fazer algo como (aqui para pesquisar John
e informar a equipe ):
$ cut -c12-26 <emplist | paste -d: - emplist | grep '^[^:]*John' | cut -c1-16,47-59
John Thompson :Hawks
John Jacobs :Hawks
Dean Johnson :Vegans
Primeiro, não me permitem o awk, sed ou perl.
Para minha tarefa, recebi um arquivo da lista de funcionários:
Marketing Ranjit Singh FULLEagles Dean Johnson
Marketing Ken Whillans FULLEagles Karen Thompson
Sales Peter RobertsonPARTGolden TigersRich Gardener
President Sandeep Jain CONTWimps Ken Whillans
Operations John Thompson PARTHawks Cher
Operations Cher CONTVegans Karen Patel
Sales John Jacobs FULLHawks Davinder Singh
Finance Dean Johnson FULLVegans Sandeep Jain
EngineeringKaren Thompson PARTVegans John Thompson
IT Rich Gardener FULLGolden TigersPeter Robertson
IT Karen Patel FULLWimps Ranjit Singh
Para encurtar a história, o usuário é solicitado a fornecer um nome ou parte de um nome e essa palavra é procurada APENAS na segunda "coluna". Se for encontrado lá, então o usuário é perguntado se deseja que o nome da equipe da pessoa (terceira coluna, palavra ao lado de "PARTE" ou "COMPLETA" etc.) ou o parceiro da pessoa (última coluna).
O resultado final é apenas para mostrar o nome completo ao lado do nome da equipe ou parceiro.
Não consigo descobrir o último passo ... Cortar apenas as linhas com as correspondências para a pesquisa original e exibir apenas as "colunas" necessárias.
while :
do
echo Enter the name of the player you want to search for:
read name
if (cut -c12-26 emplist | grep -n ${name} > namefile)
then
while :
do
echo 'See partner (P/p) or team name (T/t)?'
read answer
if [ ${answer} = "T" -o ${answer} = "t" ]
then
**#Steps for showing only the full name and the team name**
break
elif [ ${answer} = "P" -o ${answer} = "p" ]
then
**#Steps for showing only the full name and the partner name**
break
else
echo Please enter only T or M.
fi
done
elif [ ${name} = "ZZZ" ]
then
break
else
echo Name not found.
fi
done
Você pode fazer algo como (aqui para pesquisar John
e informar a equipe ):
$ cut -c12-26 <emplist | paste -d: - emplist | grep '^[^:]*John' | cut -c1-16,47-59
John Thompson :Hawks
John Jacobs :Hawks
Dean Johnson :Vegans
Stephane já te deu uma abordagem usando cut
mas se você quiser fazer isso puramente no bash, você poderia tentar algo como:
#!/usr/bin/env bash
## Declare the associative arrays that will
## hold your data
declare -A partner;
declare -A team;
## Read the data
while IFS= read line
do
## Extract the relevant column
fullname="${line:11:15}"
## save the other columns in their arrays
partner["$fullname"]="${line:43}"
team["$fullname"]="${line:30:13}"
done < emplist
echo "Enter the name of the player you want to search for:"
read name
## Check that the name exists or exit
if ! grep -q "$name" emplist
then
echo "Name not found"
exit
fi
## Read what we're after
while true;
do
echo "See partner (P/p) or team name (T/t)?"
read answer
case $answer in
[tTpP])
break
;;
*)
echo "Please enter only T or M."
esac
done
## Now go through each of the names in the
## second column and check if they match the
## name requested.
for fullname in "${!partner[@]}"
do
if [[ $fullname =~ $name ]];
then
case $answer in
[tT])
printf "%s\t%s\n" "$fullname" "${team[$fullname]}"
;;
[pP])
printf "%s\t%s\n" "$fullname" "${partner[$fullname]}"
;;
esac
fi
done
Tags bash grep shell shell-script cut