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 sed
es wie folgt verwenden:
sed -n '/^2 /s/.*(\([^)]\+\)).*/\1/p' file.txt
Oder awk
so:
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 ltrim
und rtrim
Werte.
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 ltrim
Parameter und rtrim
den Parameter angeben:
Z.B:
./extract-table-entry.sh "cat table.txt" "Name" 5 "(" ")"
# Output = James