난 헤어져야 해
[X] ||| you owns the [X,1] ||| you own the [X,1] ||| 1 0.02020 0.07847 0.36788 3 -0.00000 -0.00000
파이프에서 두 번째와 세 번째 매개변수가 다른 행을 출력합니다.
답변1
@manatwork의 의견/답변에 대한 설명:
grep
버전:grep '^[^|]\+|||\(.\+\?|||\)\1'
^
: 줄의 시작 부분과 일치합니다.[^|]
: 다음을 제외한 모든 문자와 일치합니다.|
\+
: 이전 패턴과 한 번 이상 일치합니다.|||
: 구분 기호와 일치합니다.\(
및\)
: 대괄호 안에 일치하는 값을 저장합니다.\1
.
: 모든 문자와 일치\+\?
: 한 번 이상, 욕심을 부리지는 않음|||
: 구분 기호와 다시 일치합니다.\1
: 괄호 안의 이전에 본 텍스트와 일치합니다.
여기서의 아이디어는 첫 번째 구분 기호까지 줄의 시작 부분을 건너뛰고 두 번째 구분 기호가 끝날 때까지 찾은 값을 저장한 다음 두 번째 연산자
\1
(즉, 세 번째 필드) 다음에 정확히 동일한 값이 있는 줄만 일치시키는 것입니다.sed
버전:sed -n '/^[^|]\+|||\(.\+\?|||\)\1/p'
같은 의미로 패턴을 나타내기 위해
grep
줄의 시작과 끝에 1을 추가하고 , 일치하는 줄을 인쇄하려면 끝에 추가 명령 문자를 추가합니다./
p
awk
버전:awk -F'\\|\\|\\|' '$2==$3'
-F'\\|\\|\\|'
: 필드 구분 기호를 나타냅니다.|||
이 경우 이스케이프되었습니다.'$2==$3'
:두 번째와 세 번째 필드가 동일한 입력만 필터링합니다.
답변2
저는 이 솔루션을 선호 awk
하지만 Bash만 사용하고 싶다면 제 대답은 다음과 같습니다.
foo()
{
local filename="$1";
[[ $filename ]] || return 1
while read -r line; do
l="${line#*|||}"; a2="${l%%|||*}"
l="${l#*|||}"; a3="${l%%|||*}"
[[ $a2 = $a3 ]] && echo "$line"
done < "$filename"
}
용법: foo filename.txt
예제 출력:
rany$ cat > filename.txt
a|||b|||c|||d|||
a|||b|||c|||d|||
a|||E|||E|||d|||
a|||B|||B|||d|||
rany$ foo filename.txt
a|||E|||E|||d|||
a|||B|||B|||d|||