다음은 "\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 awk
split
이 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개의 요소가 있으며, 마지막 두 행에는 각각 하나의 요소만 있습니다.