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 sed
así:
sed -n '/^2 /s/.*(\([^)]\+\)).*/\1/p' file.txt
O awk
así:
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, ltrim
valores 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 ltrim
parámetro y rtrim
el parámetro:
P.ej:
./extract-table-entry.sh "cat table.txt" "Name" 5 "(" ")"
# Output = James