2012-06-07 3 views
1

필자는 파이프로 구분 된 많은 열을 가진 txt 파일을 가지고 있습니다. 열 $36이 '0'인지, null인지 또는 공백인지 확인한 다음 전체 행을 필터링하고 싶습니다.awk의 빈 값 검색

awk -F"|" 'BEGIN{OFS="|"} NR!=1, $3="A" && $36!=0 && length($36)>0 
{print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30, 
$31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", "" }' 

length($36)>0을 사용해 보았지만 공백 값으로 작동하지 않았습니다. 열이이 ||과 같은 파일을 볼 수 있습니다 (중간에 파이프가 두 개 없음).

이 값을 확인하고 필터를 적용하는 데 도움을주십시오.

답변

1

$36 ~ /^$|0/을 사용하여 0 또는 빈 문자열을 필터링하십시오. 당신은 필터링 할 수 있습니다

+0

(공백 값 || (두 개의 파이프가 중간에 없음))을 제거해보십시오. 사이에 어떤 가치가 있음을 알 수 없습니까? – user1415006

+0

@ user1415006 : 길이 ($ 36)? –

1

이 조건을 사용하는 것입니다 : 당신은 아마 더 수직 공간을 사용하여 코드를 약간 단순화 할 수

awk -F '|' '($36 ~ /^0?$/)' file 
+0

빈 레코드를 지우지 않는 것 – user1415006

+1

시도해 볼 수 있습니까 :'awk -F '|' '($ 36 ~/^ * $ | 0 /)'파일 ' – anubhava

1

. 수수께끼 같은 상태에 쉼표가 있습니다. 아마 &&이어야한다고 생각합니다. 그림과 같이 작업이없는 조건 (기본 동작 인 print $0)과 조건없는 동작 (모든 행에 기본 일치가 있음)이 있습니다.

awk -F"|" 'BEGIN{OFS="|"} 
    NR != 1 && $3 = "A" && $36 != 0 && length($36) > 0 { 
     print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30, 
      $31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", "" 
    }' 

참고로 {은 조건과 같은 줄에 있습니다. 개인적으로, 나는 아마 그것을 써서 :

awk -F"|" 'BEGIN{OFS="|"} 
    { 
     if (NR != 1 && $3 = "A" && $36 != 0 && length($36) > 0) 
     { 
      print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30, 
        $31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", "" 
     } 
    }' 

는 지금까지, 당신이 $3A 경우는, 데이터의 첫 번째 행이 아닌 경우 인쇄 할 있으리라 믿고있어, 및 $36이 경우 어느 쪽도 없습니다 빈 또는 0. '필터링하고 싶습니다'라고 말하면서 필터링 된 행을 포함 시키거나 제외할지 여부는 설명하지 않습니다. 당신은 필드 (36)가 비어있는 행에만 관심이 있다면, 당신은에 조건을 단순화 할 수 있습니다 :

awk -F"|" 'BEGIN{OFS="|"} 
    { 
     if (NR != 1 && $3 = "A" && $36 != "") 
     { 
      print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30, 
        $31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", "" 
     } 
    }' 

아니면 그냥 length($36) > 0를 대신 사용할 수 있습니다; 이 문맥에서는 동등합니다.

샘플 데이터를 제공하지 않았으므로 81 개 이상의 파이프 구분 필드가있는 레코드가 어떻게 생겼는지 확인할 수 없으므로이 코드를 테스트 할 수 없습니다. 질문 할 때 코드를 단순화해야합니다. 당신은 예를 들어 4 개의 컬럼으로 할 수 있고, 80+ 컬럼을 가진 실제 사례로 소규모 솔루션을 다시 적용 할 수 있습니다.

1
$36 !~ /^[0 ]*$/ 

당신이 원하는 일을해야하지만 항목이 0 값이있는 경우는 (예 0.0) 일치하지 않습니다. 이를 위해

$36 && $36 !~ /^[0 ]*$/