2016-10-20 10 views
0

ゼロ以外の値を持つカラム/フィールドを取得するための良いアイデア。ゼロ以外の値を持つカラムを取得するAWK

データ

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

ので、出力は

col1 col3 .... col50 
    1  1   1 

編集する必要があります:例が間違っていたので、それを編集しました。

+0

あなたは何を試してみましたか?すべてのデータとヘッダー行を除く各行のすべての値が少なくとも1つの非ゼロ値を含んでいることを確認する必要があります。すべての行のデータを読むまでは、ヘッダー行以外は印刷できません。それはAwkにとっては問題になります。 –

+0

ジョナサン、実際に私が持っていた例は間違っていました。それを指摘してくれてありがとう。 –

+0

入力ファイルは実際には2行、1行のヘッダー行と1行のデータ行ですか?または、最初の行を除く各行のゼロでない要素を表示するだけですか?または、関連する見出しと各行の関連する列を印刷する必要があります(見出しのサブセットとして出力行1、行1の非ゼロデータとして行2、見出しのサブセットとして行3、行2の非ゼロデータとしての行4など)?または何?もともとそうだったよりも単純なら、もう一度何を試しましたか?しかし、あなたは本当に入力と出力をより明確に説明する必要があります。 –

答えて

1

awkレスキュー!

これは... 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

、同様に複数のレコードのためのより一般的なソリューションを複数の行を処理する必要があります。

$ 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 

を実行して:最初のそれは第二に、それは1秒を持つレコードを出力し、1秒とcolsのためにチェックして行く上で

$ awk -f program.awk data.txt data.txt 
col1 col3 col4 
1 1 0 
0 1 1 
関連する問題