테이블에서 특정 데이터를 추출하는 방법은 무엇입니까?

테이블에서 특정 데이터를 추출하는 방법은 무엇입니까?

여기 테이블이 있습니다 ...

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

같은 그룹에 속한 사람의 이름을 추출하고 싶습니다. 여기서 John과 James는 그룹 2에 속합니다. 다음 출력을 표시하려면 어떤 bash 명령 또는 스크립트를 사용해야 합니까?

John
James

다양한 유형의 grep 조합을 사용했습니다. 하지만 작동하지 않는 것 같습니다.

답변1

다음과 같이 사용할 수 있습니다 sed.

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

또는 awk다음과 같습니다:

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

첫 번째 솔루션은 인쇄하기 전에 해당 줄을 괄호로 묶은 문자열로 바꿉니다. 두 번째 솔루션은 괄호를 필드 구분 기호로 사용한 다음 필드 2(포함된 문자열)만 인쇄합니다.

답변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개의 매개변수, 명령, 열(숫자 또는 텍스트 값), 행(숫자 또는 텍스트 값), 선택적으로 ltrimrtrim값을 허용합니다.

출력에 두 개 이상의 테이블이 포함되거나 출력에 테이블의 일부가 아닌 추가 텍스트가 포함된 경우 작동합니다.

./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

관련 정보