![조건에 따라 라인 추출](https://linux55.com/image/66060/%EC%A1%B0%EA%B1%B4%EC%97%90%20%EB%94%B0%EB%9D%BC%20%EB%9D%BC%EC%9D%B8%20%EC%B6%94%EC%B6%9C.png)
쉼표로 구분된 파일의 각 줄에는 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
. sed
AT&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
)에 넣은 후 필수 필드의 상태를 확인합니다.