2017-07-17 1 views
2

私は数字のファイルを持っています.2行の数値と各列の数値を合計したいのですが、最後のステップでは、 '0'の合計カウントの3つ以上のカウントを有する。awkコマンドを使用して行のペアを合計し、特定の条件でフィルタを外す

これは私のファイル(ofcのコメントなし)であり、2行の行(= 4行)と5列のファイルが入っています。

2 6 0 8 9 # pair 1.A 
0 1 0 5 1 # pair 1.B 
0 2 0 3 0 # pair 2.A 
0 0 0 0 0 # pair 2.B 

そして、私はそう、私はその後、私は、元の行を印刷したい。このような何か(中間ステップ)

2 7 0 13 10 # sum pair 1, it has one 0 
0 2 0 3 0 # sum pair 2, it has three 0 

を得る線対を総括する必要がありますが、唯一のものが0の合計(2つのラインの和)従って、私はこれを印刷取得する必要があり、3未満である。

2 6 0 8 9 # pair 1.A 
0 1 0 5 1 # pair 1.B 

ラインの第二の対の和三0を有するので、それはexcludなければなりませんed

最初のファイルから、私は最後の出力を取得する必要があります。

今まで私ができることは、行のペアを合計し、ゼロを数え、3より小さい数を持つものを0と特定することです。しかし、私はこの2行を印刷する方法を知らないSUM、私は2行(最後の行)のうちの1行しか印刷できません。

awk ' 
    NR%2 { split($0, a); next } 
    { for (i=1; i<=NF; i++) if (a[i]+$i == 0) SUM +=1; 
    if (SUM < 3) print $0; SUM=0 }' myfile 

(それは私が今何を得るのです)

0 1 0 5 1 # pair 1.B 

感謝を:これは私が使用していますawkのです!

答えて

2

別のバリエーション他の人々を助けることを願って、いくつかの入力例では、ループの繰り返しを避けるために有用である可能性:

awk '!(NR%2){ zeros=0; for(i=1;i<=NF;i++) { if(a[i]+$i==0) zeros++; if(zeros>=3) next } 
    print prev ORS $0 }{ split($0,a); prev=$0 }' file 

出力:

2 6 0 8 9 
0 1 0 5 1 
+0

それはあまりにも道高速です、ありがとう! – Dovi

+0

@Dovi、よろしくお願いします – RomanPerekhrest

1

まあ、もう少し掘り後、私は前の行(私は自分自身を複雑にされた)を印刷するためにかなり単純であることがわかった

awk ' 
    NR%2 { split($0, a) ; b=$0; next } 
    { for (i=1; i<=NF; i++) if (a[i]+$i == 0) SUM +=1; 
    if (SUM < 3) print b"\n"$0; SUM=0}' myfile 

だから、僕は、変数bで最初の行を保存する必要があります条件が良好であれば印刷する。 が、それはあまりにも

1
$ cat tst.awk 
!(NR%2) { 
    split(prev,p) 
    zeroCnt = 0 
    for (i=1; i<=NF; i++) { 
     zeroCnt += (($i + p[i]) == 0 ? 1 : 0) 
    } 
    if (zeroCnt < 3) { 
     print prev ORS $0 
    } 
} 
{ prev = $0 } 

$ awk -f tst.awk file 
2 6 0 8 9 
0 1 0 5 1 
関連する問題