Wie extrahiere ich bestimmte Daten aus der Tabelle?

Wie extrahiere ich bestimmte Daten aus der Tabelle?

Hier ist die Tabelle...

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

Ich möchte Personennamen extrahieren, die zur selben Gruppe gehören. Hier gehören John und James zur Gruppe 2. Welche (Kombination von) Bash-Befehlen oder Skripts sollte ich verwenden, um die folgende Ausgabe anzuzeigen?

John
James

Ich habe verschiedene Arten von Grep-Kombinationen verwendet. Aber es scheint nicht zu funktionieren.

Antwort1

Sie könnten sedes wie folgt verwenden:

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

Oder awkso:

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

Die erste Lösung ersetzt die Zeile vor dem Ausdruck durch den in Klammern eingeschlossenen String. Die zweite Lösung verwendet Klammern als Feldtrennzeichen und druckt dann nur Feld zwei (den eingeschlossenen String).

Antwort2

Ich habe hierfür ein Bash-Skript geschrieben, das aber mit allen möglichen Befehlen als Eingaben funktioniert.

Hier ist das Skript:

#!/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

Es akzeptiert ein optionales Flag plus 3 bis 5 Parameter, den Befehl, die Spalte (Zahl oder Textwert) und die Zeile (Zahl oder Textwert) und optional ltrimund rtrimWerte.

Dies funktioniert, wenn die Ausgabe mehr als eine Tabelle enthält oder wenn die Ausgabe zusätzlichen Text enthält, der nicht Teil der Tabelle ist.

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

Um die Klammern zu entfernen, können wir einfach den ltrimParameter und rtrimden Parameter angeben:

Z.B:

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

verwandte Informationen