여기 테이블이 있습니다 ...
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개의 매개변수, 명령, 열(숫자 또는 텍스트 값), 행(숫자 또는 텍스트 값), 선택적으로 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