sed를 사용하여 분할

sed를 사용하여 분할

난 헤어져야 해

[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|||

관련 정보