조건에 따라 라인 추출

조건에 따라 라인 추출

쉼표로 구분된 파일의 각 줄에는 5개의 필드가 있습니다.

a,b,c,d,e
f,g,c,i,
j,k,c,m,n
o,p,c,r,s
t,u,c,w,
x,y,z,aa,bb

세 번째 필드에 c가 있고 다섯 번째 필드가 비어 있지 않은 행을 추출하는 방법은 무엇입니까? 결과는 다음과 같습니다:

a,b,c,d,e
j,k,c,m,n
o,p,c,r,s

답변1

가능한 해결책 awk:

awk -F',' '$3 == "c" && $5' file

실제 데이터에 따라 주석에 언급된 대로 작동하지 않을 수 있습니다(이 점을 지적한 Janis에게 감사드립니다. f,g,c,i,0예를 들어 5번째 필드가 0인 경우 누락될 수 있음). 따라서 다음을 수행할 수 있습니다.

awk -F',' '$3 == "c" && $5 != ""' file

이것이 허용되는 답변이므로 문자열에 다섯 번째 필드를 강제하는 덜 명확한 방법을 추가합니다(cuonglm(+1) 솔루션에 표시된 대로).

awk -F',' '$3 == "c" && $5""' file

답변2

sed -n '/,$/!s/^\([^,]*,\)\{2\}c/&/p'

...POSIX용 sed. sedAT&T를 구현할 수 있는 경우향상된정규식 - 예를 들어열지 마세요패키지 - 다음과 같이 할 수 있습니다:

sed -nX '/^(([^,]*,){2}c.*)&(.*,)!$/p'

물론 후자의 시나리오가 사실이라면 당신도 비슷한 상황에 처할 수 있다.grep ksh93(BTW, 내장 으로 컴파일 가능 )따라서 아마도 다음과 같이 해야 할 것입니다:

grep -xX '(([^,]*,){2}c.*)&(.*,)!'

답변3

그리고 awk:

awk -F, '$3 == "c" && $5""' file

awk, 0및 에는 ""부울 컨텍스트에서 두 개의 거짓 값이 있습니다. 따라서 이와 같은 작업을 수행하면 $3 == "c" && $5다섯 번째 필드가 있는 행을 놓칠 수 있습니다 0. 다섯 번째 필드를 문자열로 $5""변환하면 true로 평가됩니다.awk"0"

답변4

사용 python:

#!/usr/bin/env python2
with open('file.txt') as f:
    for line in f:
        fields = line.rstrip().split(',')
        if fields[2] == 'c' and fields[4]:
            print line.rstrip()

여기서는 쉼표( )로 구분된 각 행의 필드를 ,목록( fields)에 넣은 후 필수 필드의 상태를 확인합니다.

관련 정보