¿Cómo extraer datos específicos de la tabla?

¿Cómo extraer datos específicos de la tabla?

Aquí está la mesa...

Group   Name            Designation
2       (John)          Front End Developer
12      (Jim)           Back End Developer
8       (Jill)          Full Stack Developer
21      (Jack)          Front End Developer
2       (James)         Front End Developer
12      (Jane)          Full Stack Developer

Quiero extraer nombres de personas que pertenecen al mismo grupo. Aquí John y James pertenecen al grupo 2. ¿Qué (combinación de) comandos o script bash debo usar para mostrar el siguiente resultado?

John
James

Usé diferentes tipos de combinaciones grep. Pero no parece funcionar.

Respuesta1

Podrías usar sedasí:

sed -n '/^2 /s/.*(\([^)]\+\)).*/\1/p' file.txt

O awkasí:

awk -F "[()]" '/^2 / {print $2}' file.txt

La primera solución reemplaza la línea con la cadena entre paréntesis antes de imprimirla. La segunda solución utiliza paréntesis como separadores de campos y luego solo imprime el campo dos (la cadena adjunta).

Respuesta2

Escribí un script bash para hacer esto, pero para trabajar con todo tipo de comandos como entradas.

Aquí está el guión:

#!/bin/bash

# Flags - to avoid potential conflicts when the labels are numbers
# 1st
# -n = only number for column
# -t = only text for column
# -a = any for column
# 2nd
# -n = only number for row
# -t = only text for row
# -a = any for row
nc=1; tc=1; nr=1; tr=1
if [ ${1:0:1} == "-" ]; then
    if [ ${1:1:1} == "n" ]; then
        tc=0
    elif [ ${1:1:1} == "t" ]; then
        nc=1
    fi
    if [ ${1:2:1} == "n" ]; then
        tr=0
    elif [ ${1:2:1} == "t" ]; then
        nr=1
    fi
    shift
fi
command="$1"
# Number or text value
column="$2"
row="$3"
ltrim="$4"
rtrim="$5"

columnNo=-1
rowNo=-1

exec < /dev/null

while read -r -a columns; do
    (( rowNo++ ))
    if (( columnNo == -1 )); then
        total="${#columns[@]}"
        columnNo=$(for (( i=0; i<$total; i++ ))
        {
            if [[ "${columns[$i]}" == "$column" && "$tc" == 1 ]] || [[ "$column" == "$i" && "$nc" == 1 ]]; then
                echo "$i"
                break
            elif (( i >= total - 1 )); then
                echo -1
                break
            fi
        })
    else
        if [[ "${columns[0]}" == "$row" && "$tr" == 1 ]] || [[ "$rowNo" -eq "$row" && "$nr" == 1 ]]; then
            str="${columns[columnNo]}"
            str=${str#"$ltrim"}
            str=${str%"$rtrim"}
            echo "$str"
            exit 0
        fi
    fi
done < <($command 2> /dev/null)
echo "Error! Could not be found."
exit 1

Acepta un indicador opcional más de 3 a 5 parámetros, el comando, la columna (número o valor de texto) y la fila (número o valor de texto) y, opcionalmente, ltrimvalores rtrim.

Funciona cuando el resultado contiene más de una tabla o el resultado contiene texto adicional que no forma parte de la tabla.

./extract-table-entry.sh "cat table.txt" "Name" 1
# Output = (John)
./extract-table-entry.sh "cat table.txt" "Name" 5
# Output = (James)

Para eliminar los corchetes, simplemente podemos especificar el ltrimparámetro y rtrimel parámetro:

P.ej:

./extract-table-entry.sh "cat table.txt" "Name" 5 "(" ")"
# Output = James

información relacionada