awk 부분적으로 문자열 일치 (열 / 단어가 부분적으로 일치하는 경우)


84

내 더미 파일은 다음과 같습니다.

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

snow$ 3에 문자열이 있으면 줄을 얻고 싶습니다 . 다음과 같이 할 수 있습니다.

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

그러나 더 간단한 방법이 있어야합니다.

답변:


160
awk '$3 ~ /snow/ { print }' dummy_file 

28
엄밀하게는, 인쇄가 필요하지 않습니다 : '$3~/snow/'충분할를
SheetJS

2
슬프게도 링크는 이미 죽은 다음은 현재 링크입니다 shop.oreilly.com/product/9781565924277.do은
Stedy

\ [같은 특수 기호가 있다면 "내 경우, 색인 ()가 더 나은 솔루션 동안 귀하의 패턴은,"눈 "입니다.
치우 Yangfan

수표를 무효화하는 방법이 있습니까? 나는 우리가 'print'대신 'next'를 사용하고 다른 모든 것을 인쇄 할 수 있다는 것을 압니다. 그러나 단지 더 적은 지시로 무언가를 확인하는 것입니다
Sahas

5
사용하다 ! 그래서 예를 들어, AWK '$ 3 ~ / foo는 /!'
아메드 마수드

41

index () 함수로 하위 문자열을 찾아서도 가능합니다.

awk '(index($3, "snow") != 0) {print}' dummy_file

더 짧은 버전 :

awk 'index($3, "snow")' dummy_file

7
이것은 "snow"를 정규 표현식이 아닌 리터럴 문자열로 처리하기 때문에 Ahmed Masud의 대답보다 낫습니다.
jarno 2015

6
더 간단하게 작성할 수 있습니다.awk 'index($3, "snow")' dummy_file
jarno

2
나는 이것이 내 대답보다 낫다는 데 동의합니다.
Ahmed Masud


8

세 번째 필드가 다음 중 하나 snow이거나 snowman전용 인 행을 인쇄 합니다.

awk '$3~/^snow(man)?$/' file

2

GNU sed

sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file

입력:

C1 C2 C3    
1 눈   
2b 눈사람 
눈 c sowman
      눈 눈 snowmanx

..산출:

1 눈
2b 눈사람

9
이것은 매우 간단한 질문에 대한 더 복잡한 대답이 될 수 없습니다.
Sam

1
또한 sed전체 단어 를 사용하는 것은 매우 위험합니다 . 즉 안정적으로 작동하기에, 기술적으로 가능한 긴하지만, 나는뿐만 아니라 모양 숨김,보기 앞으로 사용했다 !?가해야 단어에 대해 때 구성 되지 따릅니다. 이것은 희미한 마음을위한 것이 아닙니다. (그리고 오류를 찾아 수정하는 데 많은 시간이
소요될
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.