2016-10-20 2 views
0

0이 아닌 열/필드를 가져 오는 것이 더 좋습니다.0이 아닌 값으로 열을 가져 오는 AWK

데이터

 col1 col2 col3 .... col50 
     1  0 1   1 

때문에 출력은

col1 col3 .... col50 
    1  1   1 

편집해야한다 : 예 잘못했다, 그래서 편집.

+0

당신은 무엇을 시도? 모든 데이터와 헤더 행을 제외한 각 행의 모든 ​​값이 적어도 하나의 0이 아닌 값을 포함하는지 확인하는 기능을 읽을 필요가 있습니다. 모든 데이터 행을 읽을 때까지 헤더 행을 제외한 모든 것을 인쇄 할 수 없습니다. 그게 Awk에게는 문제가됩니다. –

+0

조나단, 실제로 내가 가진 예가 잘못되었습니다. 지금 편집하십시오. 그것을 지적 주셔서 감사합니다. –

+0

입력 파일은 실제로 두 줄, 하나의 헤더 줄 및 하나의 데이터 줄입니까? 또는 첫 번째 행을 제외한 각 행의 0 아닌 요소를 인쇄해야합니까? 또는 각 행에 관련 제목과 관련 열을 인쇄해야합니까 (출력 행 1을 표제의 서브 세트로, 행 2를 행 1의 비 0 데이터로, 행 3을 표제의 서브 세트로, 2 행의 0이 아닌 데이터로 4 번 행 등)? 또는 무엇을? 그리고 그것이 원래 생각했던 것보다 더 간단하다면, 한번 더 시도해 보셨습니까? 그러나 당신은 정말로 입력과 출력을보다 명확하게 설명 할 필요가 있습니다. –

답변

1

awk the rescue!

이 ... AWK에서

$ awk 'NR==1{split($0,h); next} 
    NR==FNR{for(i=1; i<=NF; i++) if($i!=0) cols[i]; next}    
      {for(i=1; i<=NF; i++) if(i in cols) printf "%s", $i OFS; 
      print ""}' file{,} | column -t 

col1 col3 col50 
1  1  1 
1

뿐만 아니라 여러 레코드에 대한보다 일반적인 솔루션을 여러 행을 처리해야합니다. 처음에 그것이 1 초 레코드를 출력 초에 1 초에 COLS를 확인 이동 :

$ cat program.awk 
NR>1 && NR==FNR {        # find columns to output, build a arr on 1 
    for(i=1;i<=NF;i++) 
     if($i) a[i] 
    next 
} 
sub(/1/,"1") {        # output only records with 1s 
    split($0,b," ")       # split record to b arr 
    for(i=1;i<=NF;i++) 
    if(i in a)        # print on a arr 
     printf "%s%s", b[i], (i==NF?ORS:OFS) 
} 

데이터 :

$ cat data.txt 
col1 col2 col3 col4 
0 0 0 0 
1 0 1 0 
0 0 1 1 

실행이 :

$ awk -f program.awk data.txt data.txt 
col1 col3 col4 
1 1 0 
0 1 1 
관련 문제