2

UNIXの質問があります。次のようなファイルがあります。

AAAA    0   1   2   2   0

BBBBB   2   2   2   2   2

CCCCC   1   1   0   1   1

DDDD    0   0   0   0   0

EEEEE   2   2   0   2   2

このファイルには、このような何千もの行があります(また、タブで区切られています)。ファイルの最初の列は名前で、2番目から6番目の列はデータです。重要なのは2列目から6列目の情報です。2列目から6列目が10(ゼロ)以下のすべての行を出力する必要があります。たとえば、出力を次のようにしたいと思います。

BBBBB   2   2   2   2   2

CCCCC   1   1   0   1   1

EEEEE   2   2   0   2   2

私はこれを可能な限り単純な方法で実行しようとしており、次のawkコマンドを試しました。

awk 'BEGIN{out!=0;}{if($2!=0)out++;if($3!=0)out++;if($4!=0)out++;if($5!=0)out++;if($6!=0)out++;if (out>=4)print;}'

しかし、これを試してみると、元の入力ファイルが表示されます。何が悪いのか、あるいは正しいアプローチを取っているのかどうかはわかりません。どんな助けでもいただければ幸いです。

4

5 に答える 5

2

あなたがしている間違いは、各レコードの out 変数をリセットするのではなく、代わりに BEGIN ブロックで一度だけ初期化することです。(また、「等しくない」を使用して誤って初期化しています。)

awk '{out = 0; if($2!=0) out++; if($3!=0) out++; if($4!=0) out++; if($5!=0) out++; if($6!=0) out++; if(out>=4) print}'
于 2012-06-21T00:04:24.117 に答える
0

これを行うためのはるかに簡単な方法は次のとおりです。

awk '{count=0;for(i=2;i<=NF;i++){if($i~/0/)++count;}if(count <=1)print}' file1

以下でテスト済み:

> cat file1
AAAA    0       1       2       2       0
BBBBB   2       2       2       2       2
CCCCC   1       1       0       1       1
DDDD    0       0       0       0       0
EEEEE   2       2       0       2       2
sEEEE   2       0       0       0       2
> awk '{count=0;for(i=2;i<=NF;i++){if($i~/0/)++count;}if(count <=1)print}' file
BBBBB  2 2 2 2 2
CCCCC  1 1 0 1 1
EEEEE  2 2 0 2 2
> 
于 2012-06-21T05:20:06.793 に答える
0

列が特定の形式に準拠していると仮定することは危険な場合があります。以下は、ブール変数の 0,1 プロパティを使用した簡単なソリューションです。

awk '($2==0) + ($3==0) + ($4==0) + ($5==0) + ($6==0) <2' file.txt
于 2012-06-22T14:37:32.923 に答える
0
awk '
  {
    nzero=0
    for (fld = 2; nzero <= 1 && fld <= 6; fld++) {
      if ($fld == 0) nzero++
    }
    if (nzero <= 1) print
  }
' filename
于 2012-06-21T01:05:35.070 に答える
0

を使用した片道perl

perl -ne 'print if(tr/0/0/ <= 1)' file.txt

各行の名前には数字 (具体的0には ) が含まれておらず、長さが 1 桁を超えていないと想定しています。また、-iフラグを追加すると、ファイル内で変更を加えることができます。

于 2012-06-21T00:36:26.003 に答える