Вот таблица...
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
Я хочу извлечь имена людей, принадлежащих к одной группе. Здесь Джон и Джеймс принадлежат к группе 2. Какую (комбинацию) команд bash или скрипт мне следует использовать для отображения следующего вывода
John
James
Я использовал разные типы комбинаций grep. Но, похоже, это не работает.
решение1
Вы можете использовать sed
это так:
sed -n '/^2 /s/.*(\([^)]\+\)).*/\1/p' file.txt
Или awk
вот так:
awk -F "[()]" '/^2 / {print $2}' file.txt
Первое решение заменяет строку строкой, заключенной в скобки, перед ее печатью. Второе решение использует скобки в качестве разделителей полей, а затем печатает только поле два (заключенную строку).
решение2
Я написал bash-скрипт, который делает это, но работает со всеми видами команд в качестве входных данных.
Вот сценарий:
#!/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
Он принимает необязательный флаг плюс от 3 до 5 параметров, команду, столбец (число или текстовое значение) и строку (число или текстовое значение), а также необязательно ltrim
значения rtrim
.
Это работает, когда вывод содержит более одной таблицы или вывод содержит дополнительный текст, который не является частью таблицы.
./extract-table-entry.sh "cat table.txt" "Name" 1
# Output = (John)
./extract-table-entry.sh "cat table.txt" "Name" 5
# Output = (James)
Чтобы убрать скобки, мы можем просто указать ltrim
параметр и rtrim
параметр:
Например:
./extract-table-entry.sh "cat table.txt" "Name" 5 "(" ")"
# Output = James