열 값 조건과 함께 awk 사용


108

AWK 프로그래밍 언어 에서 awk를 배우고 있는데 예제 중 하나에 문제가 있습니다.

$ 2가 값 (예 :)과 같으면 $ 3을 인쇄하려면 1다음 명령을 사용하여 제대로 작동합니다.

awk '$2==1 {print $3}' <infile> | more

그러나 1을 다른 검색 기준 (예 :)으로 대체 findtext하면 명령이 작동하지 않습니다.

awk '$1== findtext {print $3}' <infile> | more

출력을 반환하지 않으며 입력 파일에 'findtext'가 있는지 확인합니다.

나는 또한 이것을 시도했지만 작동하지 않습니다.

awk '$1== "findtext" {print $3}' <infile> | more

다음은 'test'라는 이름의 테스트 파일이며 공백으로 구분 된 9 줄과 8 개 필드가 있습니다.

1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

내가 한 일과 결과는 다음과 같습니다.

$awk '$8 == "ClNonZ" {print $3}' test 

$ grep ClNonZ test 
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

$ 8에 "ClNonZ"가있는 $ 3이 표시 될 것으로 예상합니다.

0.180467091 
0.010615711 
0.492569002

awk 명령이 아무 것도 반환하지 않은 이유를 모릅니다. 이견있는 사람?


문자열 값 "findtext"를 인용해야합니다. 그렇지 않으면 변수 이름입니다
evil otto

나는 "에는 FindText"를 따옴표를 시도하지만,하지 작업 ..입니다 그것이 나를 귀찮게 않는 이유
user1687130을

1
"작동하지 않음"은 아무 것도 말해주지 않습니다. 정확한 입력, 정확한 코드, 예상 출력 및 실제 출력을 보여주세요.
chepner

답변:


128

특정 문자열을 찾으려면 그 주위에 따옴표를 넣으십시오.

awk '$1 == "findtext" {print $3}'

그렇지 않으면 awk는 변수 이름이라고 가정합니다.


나는 이것을 시도했지만 작동하지 않습니다. 이유를 모르겠습니다. 나는 grep으로 두 번 확인했고 텍스트가 거기에있었습니다. :(
user1687130 2013-02-06

1
@ user1687130, 우리에게 몇 가지 예제 입력과 예상 출력을 보여 주어야한다고 생각합니다.
Carl Norum

1
데이터가 공백으로 구분되어 있습니까? 이러한 공간 중 일부가 탭일 수 있습니까? awk를 사용하여 단일 필드를 에코 해보십시오. awk '{ print $8 }'당신이 기대하는 바를 제공 합니까 ?
Rob Davis

1
때문에 그것은있을 수 있습니다 AWK구현 (그것을 확인 awk --version), 내 대답에 봐 그것은 작동, GAWKMAWK도.
arutaku

awk 스크립트를 큰 따옴표로 묶으면 작동하지 않습니다. 좋아요awk "$1 == \"findtext\" {print $3}"
Thirupathi Thangavel

33

이 방법은 regexp를 사용하며 작동합니다.

awk '$2 ~ /findtext/ {print $3}' <infile>

덕분에 나는 ^^ 악마 같은 방법과 GREP을 사용하지 않고 $ NF에 정규식을 찾기 위해 AWK 사용하는 방법을 검색 한
티보 Loison

20

AWK구현 에 따라 사용 여부 ==는 괜찮습니다.

시도해 보셨습니까 ~?. 예를 들어 $ 1을 "hello"로 지정하려면 다음을 수행하십시오.

awk '$1 ~ /^hello$/{ print $3; }' <infile>

^$ 1 시작을 의미하고 $$ 1 끝입니다.


4
모든 awk 구현은 "=="및 "~"를 모두 지원합니다.
Ed Morton 2013

2
@EdMorton-OS X는와 awk일치하지 ==않았지만 ~.
jww

2
@jww 무엇과 무엇을 일치시키지 못했습니까? 이들은 동일 $1 == "hello"하고 $1 ~ /^hello$/. 당신은하지 않을해야 $1 ~ "^hello$"이 답변에 도시 된 바와 같이이 정규 표현식 컨텍스트에서 문자열을 사용하는 등 AWK를 사용하기 전에 정규 표현식으로 문자열을 변환하는 것 같이 그 부작용 (남자 AWK)가 있습니다.
Ed Morton

4

이것은 나를 위해 더 읽기 쉽습니다.

awk '{if ($2 ~ /findtext/) print $3}' <infile>

2

내 awk 버전은 3.1.5입니다.

예, 입력 파일은 공백으로 구분되며 탭은 없습니다.

arutaku의 답변에 따르면, 내가 시도한 것은 다음과 같습니다.

awk '$8 ~ "ClNonZ"{ print $3; }' test  
0.180467091
0.010615711
0.492569002


$ awk '$8 ~ "ClNonZ" { print $3}' test  
0.180467091
0.010615711
0.492569002

작동하지 않은 것 (왜 그리고 아마도 내 awk 버전으로 인해 :),

$awk '$8 ~ "^ClNonZ$"{ print $3; }' test
$awk '$8 == "ClNonZ" { print $3 }' test

귀하의 답변, 의견 및 도움에 감사드립니다!


9
이것은 awk 버전과 관련이 없습니다. Windows에서 테스트 파일을 만들었으므로 각 줄의 끝에 control-M을 추가하는 데 사용했던 도구가 무엇이든간에 각 줄의 마지막 필드가 ClNonZ<control-M>이고, ClNonZ이것이 grep 또는 "~와 같이 RE 부분 일치 비교가 수행되는 이유입니다. "in awk는 그것을 찾지 만 같음 비교는 찾지 않습니다.
Ed Morton 2013

2
예, 말이됩니다. $ dos2unix 테스트를 시도한 다음 "=="를 사용하여 "~"를 대체하면 작동합니다. 설명해 주셔서 감사합니다!
user1687130 2013

-3

이것을 시도하십시오

echo $VAR | grep ClNonZ | awk '{print $3}';

또는

echo cat filename | grep ClNonZ | awk '{print $3}';

슬프게도이 답변은 사용자가 구체적으로 요청한 Awk 구문을 실제로 사용하지 않습니다!
Asfand 콰지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.