Como mostrar linhas específicas de colunas específicas de um arquivo

1

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
    
por RafVasq 23.05.2014 / 05:57

2 respostas

2

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
    
por 23.05.2014 / 13:09
0

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
    
por 23.05.2014 / 16:26