Awk는 특정 열을 기반으로 모든 정규화된 열을 결정하고 출력합니다.

Awk는 특정 열을 기반으로 모든 정규화된 열을 결정하고 출력합니다.

다음은 "\t"로 구분된 세 개의 열과 공백으로 구분된 두 번째 열을 포함하는 파일입니다.

            1    a b c d e    Tom
            2    a b          Jason 
            3    c            Lisa
            4    e            Kim 

두 번째 열에 "NF>2"라는 두 개 이상의 요소가 포함된 파일을 가져오고 싶습니다.

            1    a b c d e    Tom
            2    a b          Jason

Ed Morton의 팁을 활용했습니다. 시도했지만 less -S test.txt | awk -F "\t" '{print $2}' | awk 'NF>2'전체 라인을 얻을 수 없습니다. 사실 컬럼의 특정 조건을 기준으로 조건을 만족하는 행 전체를 출력하는 방법에 대해 헷갈렸던 적이 있습니다. 나는 와 같은 몇 가지 간단한 사례만 알고 있습니다 cat test.txt | awk '{if( )print$0}'. 몇 가지 제안을 해주실 수 있나요? 감사합니다.

답변1

$ awk -F'\t' 'split($2,a," ") >= 2' input.txt 
1       a b c d e       Tom
2       a b     Jason

TAB을 필드 구분 기호로 사용하면 $2공백으로 구분된 두 개 이상의 문자열이 포함된 각 줄이 인쇄됩니다.

split()정규식을 구분 기호(이 경우 단일 공백)로 사용하여 $2문자열( )을 배열( )로 분할합니다 . 이 기능에 대한 자세한 내용은 을 a참조하십시오.man awksplit

이 awk one-liner는 배열의 내용을 사용하거나 신경 쓰지 않고 a단지 분할 함수의 반환 값(문자열이 분할된 요소 수)을 확인합니다. 2보다 크거나 같으면 조건은 true로 평가되고 전체 줄이 인쇄됩니다.


그런데 이것이 어떻게 작동하는지 더 잘 이해하고 싶다면 각 $2의 요소 수를 살펴보는 것이 도움이 됩니다. 예를 들어, 반환 값을 split변수 에 할당한 n다음 입력 라인과 함께 인쇄하는 다음 과 같습니다 .

$ awk -F'\t' '{n=split($2,a," ");printf "(n=%i)\t%s\n",n,$0}' input.txt 
(n=5)   1       a b c d e       Tom
(n=2)   2       a b     Jason
(n=1)   3       c       Lisa
(n=1)   4       e       Kim

따라서 첫 번째 행에는 5개의 요소가 있고, 두 번째 행에는 2개의 요소가 있으며, 마지막 두 행에는 각각 하나의 요소만 있습니다.

관련 정보