0
0이 아닌 열/필드를 가져 오는 것이 더 좋습니다.0이 아닌 값으로 열을 가져 오는 AWK
데이터
col1 col2 col3 .... col50
1 0 1 1
때문에 출력은
col1 col3 .... col50
1 1 1
편집해야한다 : 예 잘못했다, 그래서 편집.
0이 아닌 열/필드를 가져 오는 것이 더 좋습니다.0이 아닌 값으로 열을 가져 오는 AWK
데이터
col1 col2 col3 .... col50
1 0 1 1
때문에 출력은
col1 col3 .... col50
1 1 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 초에 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
당신은 무엇을 시도? 모든 데이터와 헤더 행을 제외한 각 행의 모든 값이 적어도 하나의 0이 아닌 값을 포함하는지 확인하는 기능을 읽을 필요가 있습니다. 모든 데이터 행을 읽을 때까지 헤더 행을 제외한 모든 것을 인쇄 할 수 없습니다. 그게 Awk에게는 문제가됩니다. –
조나단, 실제로 내가 가진 예가 잘못되었습니다. 지금 편집하십시오. 그것을 지적 주셔서 감사합니다. –
입력 파일은 실제로 두 줄, 하나의 헤더 줄 및 하나의 데이터 줄입니까? 또는 첫 번째 행을 제외한 각 행의 0 아닌 요소를 인쇄해야합니까? 또는 각 행에 관련 제목과 관련 열을 인쇄해야합니까 (출력 행 1을 표제의 서브 세트로, 행 2를 행 1의 비 0 데이터로, 행 3을 표제의 서브 세트로, 2 행의 0이 아닌 데이터로 4 번 행 등)? 또는 무엇을? 그리고 그것이 원래 생각했던 것보다 더 간단하다면, 한번 더 시도해 보셨습니까? 그러나 당신은 정말로 입력과 출력을보다 명확하게 설명 할 필요가 있습니다. –